2010-09-09 18 views
11

Busco a una forma privada no para encontrar la posición del cursor o el símbolo de intercalación (parpadear barra) en un UITextView preferentemente como CGPoint.posición del cursor en un UITextView

Puede haber una pregunta como esta pero no proporciona una forma definitiva de hacerlo. Y, No me refiero al NSRange del área seleccionada.

+0

¿Puede decirnos por qué quiere hacer esto para obtener más información de fondo? –

+0

Es para mostrar un 'UIMenuController'. – Joshua

Respuesta

20

Acaba de obtener en otro hilo:

Requiere iOS 3.2 o posterior.

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

Recuerde comprobar que selectedTextRange no es nulo antes de llamar a este método. También debe usar selectedTextRange.empty para verificar que sea la posición del cursor y no el comienzo de un rango de texto. Por lo tanto:

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

Pixel-Position of Cursor in UITextView

+1

+1 sí, esto está en el protocolo [''] (http://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UITextInput_Protocol/Reference/Reference.html) –

+1

Esto no está implementado en iOS 4.3 o inferior, como uno pensaría al leer la documentación. Solo funciona en iOS5 + – bobmoff

0

No hay manera. Punto final.

Lo único que podría hacer para venir cerrar es colocar en paralelo el texto usando CoreText, calcular la posición del texto desde un punto y aplicarlo en el UITextView. Sin embargo, esto solo funciona con selecciones que no sean de 0. Además, CoreText tiene un motor de diseño de texto diferente, que p. admite kerning, que UITextView no. Esto puede dar lugar a desviaciones del texto presentado y presentado y, por lo tanto, dar resultados subóptimos.

No hay forma de posicionar el cursor. Sin embargo, esta tarea es muy útil si usas una API privada. Es solo uno de los muchos "simplemente no" en iOS.

+0

¿Entonces no hay forma de calcular la posición del caret? – Joshua

+0

No. No con UITextView. Como dije: puedes colocar el texto por segunda vez usando CoreText y calcular la posición allí, pero eso te da estimaciones en el mejor de los casos. –

2

SWIFT 2.1 Versión:

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

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

Swift 4 versión:

// 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)") 
} 

simplemente usamos textView.selectedTextRange a ser seleccionado rango de texto y de textView.caretRect(for:) para obtener CGRect que define la posición del cursor.

Cuestiones relacionadas