2010-12-22 10 views
10

Tengo un NSScrollView que contiene un NSImageView, que cambia de tamaño según varios factores. Cuando cambia el tamaño generalmente he cambiado la imagen, por lo que desplazo el NSScrollView a la parte superior. Esto funciona bien Sin embargo, cuando comienzo a desplazar de nuevo NSScrollView, mueve algunos píxeles y luego (la mayoría de las veces) salta al final del desplazamiento. Después de que salta una vez, funciona normalmente hasta que muevo la rueda de desplazamiento hacia la parte superior otra vez. Esto me está volviendo loco. Todo lo que realmente estoy haciendo es lo siguiente:NSScrollView saltando hacia abajo en desplazamiento

[_imageView setImage: anNSImage]; 

NSRect frame; 

NSSize imageSize = [anNSImage] size]; 
frame.size = imageSize; 
frame.origin = NSZeroPoint; 

[_imageView setFrame: frame]; 
[[_mainScrollview contentView] scrollToPoint: NSMakePoint(0, [_imageView frame].size.height - [_mainScrollview frame].size.height)]; 
+0

Yo comento con la esperanza de que esta pregunta sea notada por alguien, porque me estoy volviendo bastante desesperado. Mi NSScrollView ahora está volteado, lo cual funciona mejor, porque puedo evitar hacer scrollToPoint por completo. En este caso, el punto de desplazamiento permanece estático cuando cambio el contenido, por lo que si está en la parte superior cuando lo cambio, allí permanecerá. –

+0

Sin embargo, todavía quiero configurarlo inicialmente. Lo configuro una vez, cambia de posición, comienzo a desplazarme, salta hacia abajo. Intenté configurar reflectScrolledClipView, sin éxito. –

+0

Tengo un problema casi igual al tuyo, ¿alguien puede ayudar? http://stackoverflow.com/questions/6596567/synchronize-two-nsscrollview – disorderdev

Respuesta

-4

Se establece el scrollView.contentOffset = CGPointMake (0,0). O según su requisito. Configure contechtoffset después de cambiar la imagen.

+2

Solo UIScrollView tiene una propiedad contentOffset. NSScrollView no lo hace. –

0

Mi solución hacky. Active Show Vertical Scroller (como Chetan dijo, esto es lo que desencadena el error). Enviar vista de tabla hacia atrás. Expande el borde izquierdo de la vista de tabla hasta que la barra de desplazamiento quede cubierta por lo que esté al borde derecho de la misma.

8

Nick, gracias por su código. Modifiqué tu código y funciona bien ahora. Primero, debe desplazar el desplazamiento vertical hacia arriba. En segundo lugar, desplácese por la vista de contenido.

// Scroll the vertical scroller to top 
    if ([_scrollView hasVerticalScroller]) { 
     _scrollView.verticalScroller.floatValue = 0; 
    } 

    // Scroll the contentView to top 
    [_scrollView.contentView scrollToPoint:NSMakePoint(0, ((NSView*)_scrollView.documentView).frame.size.height - _scrollView.contentSize.height)]; 
+0

Gracias! ¡Funcionó para mí! – Developer

+0

Funcionó perfectamente para mí también, gracias! – Chris

+0

Gracias! gah esto es lo que finalmente funcionó ... ahora necesito entender por qué scrollToPoint: funciona todo el tiempo, pero scrollPoint: y scrollRectToVisible: a veces son problemáticos. –

3

Para evitar este error, simplemente tiene que habilitar los scrollers y establecer la propiedad oculta de los scrollers. Como NSScrollers heredan de NSView esto sólo impide que se presentan a sí mismos:

mainScrollView.hasHorizontalScroller = YES; 
mainScrollView.hasVerticalScroller = YES; 
mainScrollView.verticalScroller.hidden = YES; 
mainScrollView.horizontalScroller.hidden = YES; 

funciona para mí por lo menos. Solo probado en OS 10.7.2.

¿Alguien tiene un radar archivado en este por cierto? No lo arreglarán si nadie les dice. :)

+1

Esto funciona, pero debe tener cuidado cuando configure la propiedad 'hidden'. Aparentemente, 'windowDidLoad' es demasiado pronto, por ejemplo. – jmk

2

Parece que puedo usar reflectScrolledClipView: en lugar de establecer los valores de los desplazadores para sincronizar la posición. Ex.

[self.scrollView.contentView scrollToPoint:NSMakePoint(300, 0)]; 
[self.scrollView reflectScrolledClipView:self.scrollView.contentView]; // synced then 
0

en MacOS Sierra, [_scrollView.contentView scrollToPoint:]; fue buggy y estaba causando parpadeo errático. Sin embargo, al usar [_scrollView.documentView scrollPoint:] se aclararon todos esos problemas por mí. Este es también el método sugerido por Apple en su tutorial encontrado here.

Cuestiones relacionadas