2016-05-23 8 views
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) Получить Изменяется Массив - (Недействительными) анализ { если (self.mRangesArray = ноль) { [self.mRangesArray removeAllObjects]!; } NSString * string = self.text; Номер NSUIntegerOfLines, index, stringLength = [длина строки];Как я могу получить текущий номер выбранной строки внутри UITextView?

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) Сравнить объекты Range внутри 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; 
       } 
     } 
    }]; 

} 

Спасибо, ребята, за вашу помощь. Ура :)

ответ

2

EDIT: Я, очевидно, игнорировал выбранных части вашего вопроса. Я все равно сохраню код здесь, если кому-то это понадобится.

Вы пробовали считать разделитель новой строки?

let str = "First\nSecond\nThird" 
let tok = str.componentsSeparatedByString("\n") 
print(tok.count) // Hopefully prints "3" 
+0

Это правильно для получения общего количества строк, которые я получаю правильно. Мне нужно, чтобы получить номер строки, или мы можем сказать, что индекс, который имеет курсор в настоящее время. – user2130948

+0

Да, я понял. Просто перечеркните это. Во всяком случае, у вас появятся проблемы, так как у вас может быть переменная высота шрифта. Вы не получаете правильное количество строк без правильного разделителя строк. Если вы можете правильно получить общее количество строк, вы можете подсчитать символы на строку и разделить ее на позицию курсора. Должно сработать. Не пытался, но я буду! – Akaino

+0

Я понял. Уточнить этот вопрос с помощью solution.Thanks :) – user2130948

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); 
+0

Я не могу использовать постоянный шрифт, потому что textView в этом случае имеет richText, а шрифт текста может меняться. – user2130948