macos cocoa appkit nsscrollview autoscroll

macos - Cómo llamar al método autoscroll de NSScrollView mediante programación



cocoa appkit (1)

Tengo una aplicación de chat simple con NSTableView basada en mensajes de texto, como se puede ver en la imagen a continuación. Cada mensaje contiene una instancia de NSTextView que tiene una altura que se ajusta a todo el texto.

Todo lo que necesito es iniciar NSScrollView (en el que está incluida la instancia de NSTableView) mientras el usuario selecciona el mouse para arrastrar el texto lo suficiente. Desafortunadamente, el desplazamiento automático no aparece. En caso de arrastrar en algún lugar fuera de las vistas de texto todos tienen éxito.

Intenté llamar a autoscroll: -método directamente con solo presionar NSEvent -instance desde NSTextView -subclass "mouse dragged" -event (como en el ejemplo de este artículo ):

- (void)mouseDragged:(NSEvent *)event { [self.scrollView autoscroll:event]; }

Como he anulado todos los eventos del mouse e implementado todo el texto seleccionado, este método invoca a menudo. Pero el desplazamiento automático no parece funcionar.

ACTUALIZAR

Me di cuenta de que antes de llamar a -autoscroll: debe haber -mouseDown: del mismo objeto. Pero rompe mi mecanismo de selección de texto. El punto, incluso en no ser el primer respondedor, no debe ser más que el mouseDown: .


Normalmente, una vista de texto está dentro de una vista de desplazamiento propia. Incluso si es lo suficientemente grande como para mostrar todo el texto sin desplazarse, todavía está allí. Una llamada de -autoscroll: en algo dentro de esa vista de desplazamiento (¿es posible que incluya esa vista de desplazamiento?) Intentará desplazar esa vista de desplazamiento, no la vista de desplazamiento que contiene la vista de tabla.

Intente llamar a -autoscroll: en una vista más arriba en la jerarquía. O self.scrollView.superview , la vista de celda de tabla o la vista de tabla.

Sin embargo, tenga en cuenta que la vista de desplazamiento de la vista de tabla seguirá desplazándose incluso después de que la vista de celda que contiene la vista de texto esté completamente en pantalla. De hecho, puede seguir desplazándolo hasta el final de la pantalla en la otra dirección. Básicamente, no sabe que está tratando de seleccionar dentro de la vista de texto, por lo que no sabe detenerse cuando la selección se extiende hasta el borde de la vista de texto.

Otro enfoque podría ser tratar de usar una vista de texto "desnudo" sin una vista de desplazamiento adjunta. No creo que IB te permita hacer eso, así que tendrías que hacerlo programáticamente. Sin embargo, las vistas de texto no se reproducen bien con el diseño automático.