es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Swift – fractionOfDistanceBetweenInsertionPoints – devuelve un espacio cuando no hay ningún carácter.

Estoy utilizando un gesto de pulsación para detectar palabras pulsadas en una etiqueta, y estoy utilizando:

let indexOfCharacter = layoutManager.characterIndex(for: locationOfTouchInTextContainer, in: textContainer, fractionOfDistanceBetweenInsertionPoints: nil)

Para verificar si el carácter pulsado está dentro del rango. El problema es que el texto está centrado, y la palabra que se necesita detectar al pulsar es la única palabra en el centro de la línea, y el código anterior detecta los espacios a los lados de la palabra como el primer carácter y el último carácter de la palabra. Esto se debe a la documentación de Apple sobre esto para:

func characterIndex(for point: CGPoint, in container: NSTextContainer, fractionOfDistanceBetweenInsertionPoints partialFraction: UnsafeMutablePointer<cgfloat>?) -> Int:

Análogo a glyphIndex(for:in:fractionOfDistanceThroughGlyph:), pero expresado en términos de índice de caracteres. El método devuelve el índice del carácter que cae bajo el punto, expresado en el sistema de coordenadas del contenedor; si no hay ningún carácter bajo el punto, se devuelve el carácter más cercano.

Necesito cambiar esto para que cuando no haya ningún carácter bajo el punto, devuelva un espacio o algo, para poder detectarlo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para cambiar el comportamiento del método characterIndex(for:) para que devuelva un espacio cuando no haya ningún carácter debajo del toque, puedes modificar el código de la siguiente manera:

    let indexOfCharacter = layoutManager.characterIndex(for: locationOfTouchInTextContainer, in: textContainer, fractionOfDistanceBetweenInsertionPoints: nil)
    if indexOfCharacter >= labelText.count {
        // Devuelve un espacio o cualquier otro carácter de tu elección
        indexOfCharacter = labelText.count - 1
    }
    

    Este código verifica si el índice devuelto es mayor o igual a la longitud del texto de la etiqueta, lo cual indica que el toque ocurrió fuera de cualquier carácter. En ese caso, puedes establecer el índice como el último carácter (o un espacio u otro carácter, según sea necesario). Esto asegurará que el código pueda detectar cuando se realiza un toque en el espacio vacío que rodea la palabra en el centro de la línea.

Comments are closed.