如何获取 UITextView 中当前选定的行号?
How can I get the current selected line number inside UITextView?
I am using the below written method for getting the current selected line number of textView having attributed text. It works fine if last line is not blank. If last line goes blank this method is not giving a proper line number.
Method :
- (NSInteger)getCurrentLineIndex{
/*
Get Current Line Inside UITextView
*/
CGPoint cursorPosition = [self caretRectForPosition:self.selectedTextRange.start].origin;
return (NSInteger)(cursorPosition.y / self.font.lineHeight);
}
Is there any other way to get the current line index?
Fixed : I already had mRangesArray in which each object gave a range of each line. Using those range objects and comparing with the selected range, I was able to fix the problem.
1) 获取范围数组
-(无效)分析
{
如果(self.mRangesArray!=无){
[self.mRangesArray 删除所有对象];
}
NSString *string = self.text;
NSUInteger numberOfLines, index, stringLength = [字符串长度];
NSMutableArray *ranges = [NSMutableArray new];
for (index = 0, numberOfLines = 0; index < stringLength; numberOfLines++)
{
NSRange range = [string lineRangeForRange:NSMakeRange(index, 0)];
[ranges addObject:[NSValue valueWithRange:range]];
}
if (self.mRangesArray == nil) {
self.mRangesArray = [[NSMutableArray alloc]init];
}
self.mRangesArray = ranges;
}
2) 将 RangesArray 中的范围对象与当前选择的范围进行比较
- (NSInteger)getCurrentLineIndex{
/*
此方法将用于获取 mRangesArray
*/
[自我分析];
/*
Get Current Line Inside UITextView
*/
NSRange selectedRange = self.selectedRange;
__block NSInteger index = [self.mRangesArray count]-1;
[self.mRangesArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSRange objectRange = [obj rangeValue];
if (*stop == NO) {
if (NSLocationInRange(selectedRange.location, objectRange)) {
index = idx;
*stop =YES;
return;
}
}
}];
}
感谢大家的帮助。干杯:)
尝试此代码有效
UIFont * fontNAme = [UIFont boldSystemFontOfSize:13.0];
CGSize size = [textView.text fontNAme constrainedToSize:textView.frame.size lineBreakMode:UILineBreakModeWordWrap];
int lineNumber = size.height / fontNAme .lineHeight;
NSLog(@"line = %d", lineNumber);
编辑:我显然忽略了您问题的当前选择 部分。
我仍将代码保留在这里以备不时之需。
你试过计算换行符吗?
let str = "First\nSecond\nThird"
let tok = str.componentsSeparatedByString("\n")
print(tok.count) // Hopefully prints "3"
I am using the below written method for getting the current selected line number of textView having attributed text. It works fine if last line is not blank. If last line goes blank this method is not giving a proper line number.
Method :
- (NSInteger)getCurrentLineIndex{
/*
Get Current Line Inside UITextView
*/
CGPoint cursorPosition = [self caretRectForPosition:self.selectedTextRange.start].origin;
return (NSInteger)(cursorPosition.y / self.font.lineHeight);
}
Is there any other way to get the current line index?
Fixed : I already had mRangesArray in which each object gave a range of each line. Using those range objects and comparing with the selected range, I was able to fix the problem.
1) 获取范围数组 -(无效)分析 { 如果(self.mRangesArray!=无){ [self.mRangesArray 删除所有对象]; } NSString *string = self.text; NSUInteger numberOfLines, index, stringLength = [字符串长度];
NSMutableArray *ranges = [NSMutableArray new];
for (index = 0, numberOfLines = 0; index < stringLength; numberOfLines++)
{
NSRange range = [string lineRangeForRange:NSMakeRange(index, 0)];
[ranges addObject:[NSValue valueWithRange:range]];
}
if (self.mRangesArray == nil) {
self.mRangesArray = [[NSMutableArray alloc]init];
}
self.mRangesArray = ranges;
}
2) 将 RangesArray 中的范围对象与当前选择的范围进行比较
- (NSInteger)getCurrentLineIndex{
/*
此方法将用于获取 mRangesArray
*/
[自我分析];
/*
Get Current Line Inside UITextView
*/
NSRange selectedRange = self.selectedRange;
__block NSInteger index = [self.mRangesArray count]-1;
[self.mRangesArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSRange objectRange = [obj rangeValue];
if (*stop == NO) {
if (NSLocationInRange(selectedRange.location, objectRange)) {
index = idx;
*stop =YES;
return;
}
}
}];
}
感谢大家的帮助。干杯:)
尝试此代码有效
UIFont * fontNAme = [UIFont boldSystemFontOfSize:13.0];
CGSize size = [textView.text fontNAme constrainedToSize:textView.frame.size lineBreakMode:UILineBreakModeWordWrap];
int lineNumber = size.height / fontNAme .lineHeight;
NSLog(@"line = %d", lineNumber);
编辑:我显然忽略了您问题的当前选择 部分。 我仍将代码保留在这里以备不时之需。
你试过计算换行符吗?
let str = "First\nSecond\nThird"
let tok = str.componentsSeparatedByString("\n")
print(tok.count) // Hopefully prints "3"