问题
I am implementing a customized rich text editor by extending the UITextView. When user selects the text range and apples the 'highlighting' menu, the editor will draw a blue background for the selected text:
- (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);
}
}
When the selected text contains a long word which caused the word wrap, the blue background looks ugly.
Is there a way to detect the position where the word wrap? Thanks!
回答1:
OK, finally I solved this problem. To detecting the word wrap or a new line break, it's simple to use following code:
#pragma UITextViewDelegate
- (void)textViewDidChange:(UITextView *)textView {
if ( ABS(lastContentSize_.height - textView.contentSize.height) > 1) {
NSLog(@"word wrap or line break!");
}
}
That's all:)
来源:https://stackoverflow.com/questions/15083109/word-wrap-detecting-in-uitextview