1
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) 获取范围数组 - (void)analysis { if (self.mRangesArray != nil) { [self.mRangesArray removeAllObjects]; } 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 内的 Range Objects 与当前选中的 Range
- (NSInteger)getCurrentLineIndex{ /* 该方法将用于获取 mRangesArray */ [self analyse];

    /*
     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;
              }
        }
    }];

}

谢谢大家帮助。干杯:)

4

2 回答 2

2

编辑:我显然忽略了你问题中当前选择的部分。如果有人需要,我仍然会将代码保留在这里。

您是否尝试过计算换行符?

let str = "First\nSecond\nThird"
let tok = str.componentsSeparatedByString("\n")
print(tok.count) // Hopefully prints "3"
于 2016-05-23T13:44:22.293 回答
0

试试这个代码它工作

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);
于 2016-05-23T13:00:24.710 回答