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.

Agregando márgenes a TextEditor.

Estoy agregando márgenes al TextEditor. Manteniendo estos márgenes como un área clickable.
Pude agregar textContainerInset y el problema es que el Inset agregado no es clickable.

Código actual:

extension NSTextView {
  open override var frame: CGRect {
    didSet {
        textContainerInset = CGSize(width: 72, height: 72)
      }
   }
}

Previsualización actual:

Comportamiento deseado (Páginas):

Agradecería algún consejo. ¡Muchas gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para hacer que el textContainerInset sea clickable, puedes agregar una subclase personalizada de NSTextView y sobrescribir el método hitTest.

    Aquí tienes un ejemplo de código:

    class ClickableTextEditorView: NSTextView {
    
        override func hitTest(_ point: NSPoint) -> NSView? {
            // Verificar si el punto está dentro del contenedor de texto
            let textContainerFrame = self.textContainerInset.insetRect(containerFrame)
            if textContainerFrame.contains(point) {
                return self
            }
            return nil
        }
    
    }
    

    En este código, sobrescribimos el método hitTest para verificar si el punto está dentro del contenedor de texto. Si lo está, devolvemos la instancia NSTextView, lo que hará que sea clickable.

    Para usar esta subclase en tu código, simplemente reemplaza NSTextView por ClickableTextEditorView:

    extension ClickableTextEditorView {
        open override var frame: CGRect {
            didSet {
                textContainerInset = CGSize(width: 72, height: 72)
            }
        }
    }
    

    Con este código, el text container inset agregado será clickable.

    Aquí tienes una vista previa del comportamiento previsto después de implementar el código:

    Vista previa del comportamiento previsto

Comments are closed.