Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>The <code>UITextInput</code> protocol includes a <code>beginningOfDocument</code> selector since iOS 3.2.<br> But <code>UITextView</code> only adopted <code>UITextInput</code> since iOS 5.0. It was previously conforming to the <code>UITextInputTraits</code> protocol.</p> <p>Source: search for UITextView here <a href="http://developer.apple.com/library/ios/#releasenotes/General/iOS50APIDiff/index.html" rel="nofollow">http://developer.apple.com/library/ios/#releasenotes/General/iOS50APIDiff/index.html</a></p> <p>If you want it to work on iOS 4.x and later, you have to perform a check and do the computation by yourself on iOS 4:</p> <pre><code>CGRect newRect = CGRectZero; if ([UITextView conformsToProtocol:@protocol(UITextInput)]) { // iOS 5 and later UITextPosition *begin = [self.tvQuestion positionFromPosition:self.tvQuestion.beginningOfDocument offset:nrange.location]; UITextPosition *end = [self.tvQuestion positionFromPosition:begin offset:nrange.length]; UITextRange *textRange = [self.tvQuestion textRangeFromPosition:begin toPosition:end]; newRect = [self.tvQuestion firstRectForRange:textRange]; } else { // iOS 3.2 to 4.3 // Compute text position manually #define TEXT_VIEW_PADDING 8.f NSString *textContent = [self.tvQuestion.text substringToIndex:NSMaxRange(nrange)]; NSDictionary *ctFontDescriptorAttributes = [NSDictionary dictionaryWithObjectsAndKeys: self.tvQuestion.font.familyName, kCTFontFamilyNameAttribute, // Uncomment for bold fonts // [NSDictionary dictionaryWithObjectsAndKeys: // [NSNumber numberWithInt:kCTFontBoldTrait], kCTFontSymbolicTrait, // nil], kCTFontTraitsAttribute, nil]; CTFontDescriptorRef ctFontDescriptor = CTFontDescriptorCreateWithAttributes((CFDictionaryRef)ctFontDescriptorAttributes); CTFontRef ctFont = CTFontCreateWithFontDescriptor(ctFontDescriptor, self.tvQuestion.font.pointSize, NULL); NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:textContent attributes:[NSDictionary dictionaryWithObjectsAndKeys: (id)ctFont, kCTFontAttributeName, nil]]; CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attributedText); CFRange globalRange = CFRangeMake(0, [attributedText length]); CGRect textRect = CGRectInset((CGRect){CGPointZero, self.tvQuestion.contentSize}, TEXT_VIEW_PADDING, TEXT_VIEW_PADDING); CTFrameRef frame = CTFramesetterCreateFrame(framesetter, globalRange, CGPathCreateWithRect((CGRect){CGPointZero, textRect.size}, NULL), NULL); CFArrayRef lines = CTFrameGetLines(frame); NSInteger nbLines = CFArrayGetCount(lines); CGPoint *lineOrigins = calloc(sizeof(CGPoint), nbLines); CTFrameGetLineOrigins(frame, CFRangeMake(0, 0), lineOrigins); CGFloat ascent = CTFontGetAscent(ctFont); CGFloat descent = CTFontGetDescent(ctFont); CGFloat leading = CTFontGetLeading(ctFont); if (leading &lt; 0) { leading = 0; } leading = floor(leading + 0.5); CGFloat lineHeight = floor(ascent + 0.5) + floor(descent + 0.5) + leading; CGFloat firstLineYOffset = 0.f; for (NSInteger i = 0; i &lt; nbLines; i++) { CTLineRef line = CFArrayGetValueAtIndex(lines, i); CFRange lineRange = CTLineGetStringRange(line); CGPoint lineOrigin = lineOrigins[i]; CGFloat ascent, descent, leading, width; width = CTLineGetTypographicBounds(line, &amp;ascent, &amp;descent, &amp;leading); if (i == 0) { firstLineYOffset = lineOrigin.y; } lineOrigin.y = (lineOrigin.y - firstLineYOffset) * -1.f; if (nrange.location &gt;= lineRange.location &amp;&amp; nrange.location &lt; lineRange.location + lineRange.length) { CGFloat secOffset; CGFloat startOffset = CTLineGetOffsetForStringIndex(line, nrange.location, &amp;secOffset); CGFloat rectWidth; if (nrange.location + nrange.length &lt;= lineRange.location + lineRange.length) { CGFloat endOffset = CTLineGetOffsetForStringIndex(line, nrange.location + nrange.length, &amp;secOffset); rectWidth = endOffset - startOffset; } else { rectWidth = width - 5 - startOffset; } newRect = (CGRect) { { lineOrigin.x + TEXT_VIEW_PADDING + startOffset, lineOrigin.y + TEXT_VIEW_PADDING + i }, { rectWidth, lineHeight } }; break; } } free(lineOrigins); CFRelease(frame); CFRelease(framesetter); CFRelease(ctFont); CFRelease(ctFontDescriptor); } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload