2016-05-23 4 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) Get Ranges Array - (void) analysieren { if (self.mRangesArray = nil) { [self.mRangesArray removeAllObjects]!; } NSString * string = self.text; NSUInteger numberOfLines, index, stringLength = [Stringlänge];Wie kann ich die aktuell ausgewählte Zeilennummer innerhalb von UITextView abrufen?

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) Vergleichen Bereich Objekte innerhalb des RangesArray mit den aktuell gewählten Bereich
- (NSInteger) getCurrentLineIndex { /* Diese Methode verwendet werden mRangesArray */ [self analysieren] zu erhalten;

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

} 

Danke Jungs für Ihre Hilfe. Cheers :)

Antwort

2

EDIT: Ich habe die aktuell ausgewählte Teil Ihrer Frage offensichtlich ignoriert habe. Ich werde den Code hier behalten, falls jemand es braucht.

Haben Sie versucht, den Zeilentrenner zu zählen?

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

Dies ist korrekt für die Gesamtanzahl der Zeilen, die ich richtig bekomme. Was ich brauche, ist, die Zeilennummer zu bekommen, oder wir können als Index sagen, der gerade den Cursor hat. – user2130948

+0

Ja, das habe ich verstanden. Lies es einfach überlesen. Wie auch immer, Sie werden Probleme bekommen, da Sie eine variable Schrifthöhe haben könnten. Sie erhalten nicht die richtige Zeilenanzahl ohne ein richtiges Zeilentrennzeichen. Wenn Sie Ihre Gesamtanzahl an Zeilen richtig berechnen können, können Sie die Zeichen pro Zeile zählen und durch die Cursorposition teilen. Sollte arbeiten. Habe es nicht versucht, aber ich werde es tun! – Akaino

+0

Ich habe es. Habe die obige Frage mit der Lösung aktualisiert. Danke :) – user2130948

0

diesen Code Versuchen Sie es funktioniert

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

Ich kann konstante Schriftart nicht verwenden, weil die textView in diesem Fall richText hat und die Textschrift variieren kann. – user2130948

Verwandte Themen