2012-07-14 2 views
12

Ich fragte einen Entwickler (TwoLivesLeft, die Schöpfer von Codea), wie sie Syntax-Highlighting in ihrer App durchgeführt haben. Er antwortete:Erhalte X- und Y-Koordinaten eines Wortes in UITextView

@ TD2 der Codea-Editor ist mit einem UITextView implementiert. Die Hervorhebung erfolgt durch Überlagerung von Teilansichten in den entsprechenden Positionen - in der Regel UILabels. Sie werden aus einem Wiederverwendungspool ( ) entfernt, ähnlich wie UITableViewCells funktioniert. Während des Scrollens müssen die Zeilen erneut hervorgehoben werden, um Markierungen aus dem Pool zu entfernen, und Zeilen, die aus dem Bildschirm verschoben haben, werfen ihre Markierungen zurück in den Pool.

Kann jemand erklären, wie ich das x und y eines bestimmten Wortes bekommen würde?

+0

So geht's. https://discussions.apple.com/thread/2511930?start=0&tstart=0 –

Antwort

33

UITextView entspricht UITextInput, von denen eine detaillierte Beschreibung gefunden werden kann here.

Sehen Sie sich die erforderlichen Methoden "textRangeFromPosition: toPosition:", "positionFromPosition: offset:", "positionFromPosition: inDirection: offset:" und einige der anderen geometriebasierten Methoden im UITextInput-Protokoll an. Diese bieten möglicherweise die Funktionalität, nach der Sie suchen.

Ich habe nicht wirklich versucht, um sicherzustellen, dass diese funktionieren, wie Sie sie auch wollen, aber das sieht aus wie es über das, was Sie brauchen.

Lassen Sie mich wissen, wenn Sie weitere Hilfe benötigen!


UPDATE:

Hier ist ein Beispielcode, wie dies zu tun. Ich habe die Methode "firstRectForRange:" zum Laufen gebracht. Dieser Code nimmt grundsätzlich die letzten drei Buchstaben des UITextView "textStuff" und markiert diesen grün.

UITextView *textStuff = [[UITextView alloc] init]; 
textStuff.frame = CGRectMake(2.0, 200.0, 200.0, 40.0); 
textStuff.text = @"how are you today?"; 
textStuff.textColor = [UIColor blackColor]; 

UITextPosition *Pos2 = [textStuff positionFromPosition: textStuff.endOfDocument offset: nil]; 
UITextPosition *Pos1 = [textStuff positionFromPosition: textStuff.endOfDocument offset: -3]; 

UITextRange *range = [textStuff textRangeFromPosition:Pos1 toPosition:Pos2]; 

CGRect result1 = [textStuff firstRectForRange:(UITextRange *)range ]; 

NSLog(@"%f, %f", result1.origin.x, result1.origin.y); 

UIView *view1 = [[UIView alloc] initWithFrame:result1]; 
view1.backgroundColor = [UIColor colorWithRed:0.2f green:0.5f blue:0.2f alpha:0.4f]; 
[textStuff addSubview:view1]; 

Ergebnis dieses Code ausgeführt wird:

enter image description here

+0

Hast du einen Startcode, der mir etwas abdrücken könnte? – Sirens

+0

Ich habe die Antwort mit einem Beispielcode aktualisiert. Beginne von dort und ändere es, damit es so funktioniert, wie du es willst. – bddicken

+0

Hat dies für Sie funktioniert? Ich würde mich freuen, wenn Sie das als Antwort akzeptieren. – bddicken

5

@https://stackoverflow.com/a/11487125/3549781 Werke bddicken wie ein Zauber. Das Problem ist jedoch, dass es unter iOS 7+ nicht funktioniert, wenn der Text eine neue Zeile "\ n" enthält. Nach langem Suchen habe ich eine Lösung dafür gefunden.

Sie haben das Layout der Textview, um sicherzustellen, bevor firstRectForRange Aufruf: von

[textView.layoutManager ensureLayoutForTextContainer:textView.textContainer]; 

Courtesy: UITextView firstRectForRange not working when there's new line characters in the mix

P. S: Zuerst habe ich dies als einen Kommentar zu @ bddicken Antwort. Da die meisten Leute keine Kommentare lesen, habe ich das als Antwort hinzugefügt.