2010-09-09 15 views
11

Cerco un non modo privato per trovare la posizione del cursore o Caret (lampeggiante bar) in una UITextView preferibilmente come CGPoint.posizione del cursore in un UITextView

Potrebbe esserci già una domanda come questa ma non fornisce un modo definitivo per farlo. E, Non intendo lo NSRange dell'area selezionata.

+0

puoi dirci perché vuoi farlo per altre informazioni di base? –

+0

È per la visualizzazione di un 'UIMenuController'. – Joshua

risposta

20

Appena ottenuto in un altro thread:

Richiede iOS 3.2 o successivo.

CGPoint cursorPosition = [textview caretRectForPosition:textview.selectedTextRange.start].origin; 

Ricordarsi di verificare che SelectedRange non sia nullo prima di chiamare questo metodo. Dovresti inoltre utilizzare selectedTextRange.empty per verificare che sia la posizione del cursore e non l'inizio di un intervallo di testo. Quindi:

if (textview.selectedTextRange.empty) { 
// get cursor position and do stuff ... 
} 

Pixel-Position of Cursor in UITextView

+1

+1 sì, questo è il [''] (http://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UITextInput_Protocol/Reference/Reference.html) protocollo –

+1

Questo non è implementato in iOS 4.3 o versioni precedenti, come si potrebbe pensare durante la lettura della documentazione. Funziona solo su iOS5 + – bobmoff

0

Non esiste un modo. Punto.

L'unica cosa che si potrebbe fare è chiudere è in parallelo disporre il testo utilizzando CoreText, calcolare la posizione del testo da un punto e applicarlo su UITextView. Questo, tuttavia, funziona solo con selezioni non 0. Inoltre, CoreText ha un motore di layout di testo diverso, ad es. supporta il kerning, che non ha UITextView. Ciò potrebbe comportare deviazioni del testo reso e delineato e fornire quindi risultati non ottimali.

Non è assolutamente possibile posizionare il cursore. Questo compito è anche molto se usi API private. È solo uno dei tanti "basta non" in iOS.

+0

Quindi non c'è assolutamente modo di calcolare la posizione del cursore? – Joshua

+0

No. Non con UITextView. Come ho già detto: puoi stendere il testo una seconda volta usando CoreText e calcolare la posizione lì, ma ciò ti dà le stime al meglio. –

2

SWIFT versione 2.1:

let cursorPosition = infoTextView.caretRectForPosition((infoTextView.selectedTextRange?.start)!).origin 

print("cursorPosition:\(cursorPosition)") 
0

Swift 4 versione:

// lets be safe, thus if-let 
if let selectedTextRange = textView.selectedTextRange { 
    let caretPositionRect = textView.caretRect(for: selectedTextRange.start) 
    let caretOrigin = caretPositionRect.origin 
    print(">>>>> position rect: \(caretPositionRect), origin: \(caretOrigin)") 
} 

Abbiamo semplicemente usiamo textView.selectedTextRange per essere selezionato gamma di testo e di textView.caretRect(for:)per ottenere CGRect definire la posizione del cursore.

Problemi correlati