2016-06-28 22 views
4

Ich habe eine UITextView, die eine NSAttributedString mit zwei Zeilenumbrüche zwischen den Zeilen hat. Ich versuche, eine einzelne Zeile in der Textansicht hervorzuheben. Ich kann einen Satz in der Textansicht einfach markieren. Aber ich muss den Satz vom Anfang der Zeile (linke Seite der Textansicht) bis zum Ende der Zeile (rechte Seite der Textansicht) markierenMarkieren Sie eine einzelne Zeile in UITextView

Ich habe den folgenden Code verwendet, um eine Zeile zu markieren, die ist von diesem Github Sample. Da jede Zeile zwei Zeilenumbrüche hat, dachte ich, nachdem ich den eigentlichen Satz hervorgehoben habe, kann ich auch die vorherigen und nächsten Zeilenumbruchzeichen erhalten und sie auch hervorheben. Aber die Ergebnisse sind nicht so, wie ich es wollte.

enter image description here

// 1. create some fonts 
UIFontDescriptor* fontDescriptor = [UIFontDescriptor 
            preferredFontDescriptorWithTextStyle:UIFontTextStyleBody]; 
UIFontDescriptor* boldFontDescriptor = [fontDescriptor 
             fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold]; 
UIFont* boldFont = [UIFont fontWithDescriptor:boldFontDescriptor size: 0.0]; 
UIFont* normalFont = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; 

if (!_highlightedWorld) { 
    _highlightedWorld = @""; 
} 

// Search for the highlighted world by using regex and highlight 
NSString* regexStr = _highlightedWorld; 
NSRegularExpression* regex = [NSRegularExpression 
           regularExpressionWithPattern:regexStr 
           options:0 
           error:nil]; 

// Highlighted attributes (Cyan font color, Bold) 
NSDictionary* boldAttributes = @{ NSFontAttributeName : boldFont, 
            NSBackgroundColorAttributeName : [UIColor cyanColor]}; 
//Normal attributes 
NSDictionary* normalAttributes = @{ NSFontAttributeName : normalFont, 
            NSBackgroundColorAttributeName : [UIColor whiteColor] }; 

// If the textview has multiple matches, iterate over each match, and highlight each. 
[regex enumerateMatchesInString:[_backingStore string] 
         options:0 
          range:searchRange 
        usingBlock:^(NSTextCheckingResult *match, 
            NSMatchingFlags flags, 
            BOOL *stop){ 

         // Highlight the actual line 
         NSRange matchRange = [match rangeAtIndex:0]; 
         [self addAttributes:boldAttributes range:matchRange]; 

         // Get the newline after the highlighted sentence, and highlight it 
         // Check if we reached the end 
         if (matchRange.location+matchRange.length < [_backingStore string].length) { 
          [self addAttributes:boldAttributes range:NSMakeRange(matchRange.location+matchRange.length, 1)]; 
         } 
         // Get the newline before the highlighted sentence, and highlight it 
         // Check if we reached the beginning 
         if (matchRange.location != 0) { 
          [self addAttributes:boldAttributes range:NSMakeRange(matchRange.location-1, 1)]; 
         } 

         // 4. reset the style to the original 
         if (NSMaxRange(matchRange)+1 < self.length) { 
          [self addAttributes:normalAttributes 
              range:NSMakeRange(NSMaxRange(matchRange)+1, 1)]; 
         } 
        }]; 
+0

Ist Ihr Text immer eine Einkaufsliste, zentriert mit diesen Wagenrücklauf? – Wain

+0

@Wain Keine Einkaufsliste, aber Sätze, zentriert mit zwei Wagenrücklauf. –

+0

Darf ich fragen, wie entscheiden Sie, welche Zeile hervorgehoben werden soll? – Happiehappie

Antwort

1

Ich würde empfehlen, dass Sie für diese eine Textansicht nicht verwenden. Was Sie haben, ist eine Liste, daher ist die Verwendung einer Tabellen- oder Sammlungsansicht für diesen Anwendungsfall viel besser geeignet. Sie machen die Handhabung der Gerätebreite und die Auswahl der Artikel effektiv trivial. Sie können auch andere Stile um die Elemente hinzufügen (was praktisch sein kann).

Ich musste es vorher nicht tun, aber im Moment mit einer Textansicht stelle ich mir vor, dass Sie schauen müssen, wie der Text in das Layout eingefügt wird und ich erwarte, dass Sie die Mitte tun müssen Ausrichtung explizit, so dass Sie die Auffüllung auf beiden Seiten auswählen können, ohne auf die vorherige oder nächste Zeile zu kaskadieren. Das ist alles andere als trivial.

Ich bin interessiert zu wissen, ob es eine einfache Lösung für das Problem der Textansicht gibt, aber es scheint wirklich die falsche Ansicht für die Daten, Display und Benutzerinteraktion, die Sie suchen.

+0

Netter Vorschlag über die Tabellenansicht, aber aus bestimmten Gründen muss ich bei der Textansicht bleiben. Weil ich Optionen habe, Text zu finden/zu ersetzen, redigiere ... –

+0

Ich kann versuchen, den Text in der Mitte ausdrücklich auszurichten, wie du sagst, aber die Polsterung auf jeder Seite wählend, ist das Problem. Ich habe keine Idee, das zu tun. Kannst du mir helfen? –

+1

es ist schwer, Sie müssen herausfinden, wie viele Zeichen passen auf die Breite der Ansicht. Textsuche und -bearbeitung können in einer Tabellenansicht gut funktionieren, die Tabelle hat sogar einen Bearbeitungsmodus, mit dem Sie arbeiten können, und Zellen kennen explizit das Bearbeiten ... – Wain

-1

Ich bin mir nicht sicher, wie das zu erklären, aber ich glaube, es hat etwas mit \ n und \ r Interpretation durch das iOS zu tun.

Ich vermute, Sie die Linie Lücke haben könnte entweder durch die Verwendung von zwei \ r oder zwei erstellt \ n dh

NSString *text = @"Shopping List\n\n1. Cheese\n\n2. Biscuits\r\r3 Sausages\n\n4. IMPORTANT Cash for going out!\n\n5. -potatoes-\n\n6. Acopy of iOS6 by tutorials\n\n7. A new iPhone\n\n8. A present for mum"; 

ODER

NSString *text = @"Shopping List\n\n1. Cheese\n\n2. Biscuits\n\n3 Sausages\n\n4. IMPORTANT Cash for going out!\n\n5. -potatoes-\n\n6. Acopy of iOS6 by tutorials\n\n7. A new iPhone\n\n8. A present for mum"; 

Beide Möglichkeiten, Ihr Code die Zeile markieren erzeugt die gleiche Ausgabe wie bei Ihnen.

Aber, wenn Sie die 2. ersetzen '\ n' oder '\ r' mit '\ r \ n' heißt

NSString *text = @"Shopping List\n\n1. Cheese\n\n2. Biscuits\r\r\n3 Sausages\n\n4. IMPORTANT Cash for going out!\n\n5. -potatoes-\n\n6. Acopy of iOS6 by tutorials\n\n7. A new iPhone\n\n8. A present for mum"; 

Oder

NSString *text = @"Shopping List\n\n1. Cheese\n\n2. Biscuits\n\r\n3 Sausages\n\n4. IMPORTANT Cash for going out!\n\n5. -potatoes-\n\n6. Acopy of iOS6 by tutorials\n\n7. A new iPhone\n\n8. A present for mum"; 

dann erhalten Sie das gewünschte Ergebnis.

+0

Sieht so aus, als ob Sie meine Frage nicht verstehen. –

+0

@RamarajT: Ich konnte eine einzelne Zeile mit Ihrem Code-Snippet markieren, wenn ich "\ n \ r \ n" verwendete, um zwei Zeilenumbrüche zu erhalten, anstatt "\ n \ n" oder "\ r \ r" zu verwenden. – SHN

Verwandte Themen