2013-02-26 31 views
1

我正在通过扩展UITextView来实现自定义的富文本编辑器。当用户选择该文本范围和苹果的“突出显示”菜单,编辑器将绘制选定文本蓝色背景:UITextView中的自动换行检测

- (CGRect)getRectAtRangePos:(NSInteger)pos { 
    UITextPosition *beginning = self.beginningOfDocument; 
    UITextPosition *start = [self positionFromPosition:beginning offset:pos]; 
    CGRect rect = [self caretRectForPosition:start]; 
    return [self convertRect:rect fromView:self.textInputView]; 
} 


- (void)drawRange:(NSRange)range { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBFillColor(context, 0x16/255.f, 0x38/255.f, 0xfc/255.f, 0.5); 
    CGRect startRect = [self getRectAtRangePos:range.location]; 
    CGRect endRect = [self getRectAtRangePos:range.location + range.length]; 

    CGFloat padding = 1; 
    CGFloat margin = 1; 

    if (ABS(endRect.origin.y - startRect.origin.y) < 5) {//They are in the same line 
     CGRect wholeRect = CGRectMake(startRect.origin.x, startRect.origin.y + padding, endRect.origin.x - startRect.origin.x, startRect.size.height - 2 * padding); 
     CGContextFillRect(context, wholeRect); 
    } 
    else {//The range occupies at least two lines 
     CGRect firstRect = CGRectMake(startRect.origin.x, startRect.origin.y + padding, self.bounds.size.width - startRect.origin.x - margin, startRect.size.height - 2 * padding); 
     CGContextFillRect(context, firstRect); 
     CGFloat heightDiff = endRect.origin.y - (startRect.origin.y + startRect.size.height); 
     if (heightDiff > 5) {//The range occupies more than two lines 
      CGRect secondRect = CGRectMake(margin, startRect.origin.y + startRect.size.height + padding, self.bounds.size.width - 2*margin, heightDiff - 2* padding); 
      CGContextFillRect(context, secondRect); 
     } 
     CGRect thirdRect = CGRectMake(margin, endRect.origin.y + padding, endRect.origin.x, endRect.size.height - 2* padding); 
     CGContextFillRect(context, thirdRect); 
    } 
} 

当所选文本中包含这引起了单词环绕一个长型字,该蓝色背景看起来很丑。

enter image description here

有没有一种方法来检测,其中自动换行的位置?谢谢!

回答

7

好的,最后我解决了这个问题。 要检测的自动换行或新分行,这是简单的使用下面的代码:

#pragma UITextViewDelegate 
- (void)textViewDidChange:(UITextView *)textView { 
    if (ABS(lastContentSize_.height - textView.contentSize.height) > 1) { 
     NSLog(@"word wrap or line break!"); 
    } 

} 

这是所有:)

+0

在IOS7此休息。不知道如何补偿。 ContentSize.height不再是查找某物的高度的可靠方法。 – 2013-09-17 20:01:48