2010-12-22 3 views
10

Ho un NSScrollView contenente un NSImageView, che si ridimensiona in base a vari fattori. Quando si ridimensiona, in genere ho cambiato l'immagine, quindi faccio scorrere NSScrollView verso l'alto. Funziona bene Tuttavia, quando comincio a scorrere di nuovo l'NSScrollView, esso si muove di alcuni pixel e quindi (la maggior parte delle volte) salta in fondo allo scroll. Dopo aver saltato una volta, funziona normalmente finché non avanzo di nuovo lo scroller. Questo mi sta facendo impazzire. Tutto ciò che sto facendo è questo:NSScrollView che salta verso il basso su scroll

[_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

Ho un commento nella speranza che questa domanda venga notata da qualcuno, perché sto diventando piuttosto disperata. Il mio NSScrollView è ora capovolto, il che funziona meglio, perché posso semplicemente evitare scrollToPoint del tutto. In questo caso, il punto di scorrimento rimane statico quando cambio il contenuto, quindi se è in alto quando passo, lì rimane. –

+0

Tuttavia, desidero comunque impostarlo inizialmente. L'ho impostato una volta, cambia posizione, inizio a scorrere, salta in fondo. Ho provato a impostare reflectScrolledClipView, senza alcun risultato. –

+0

Ho un problema quasi uguale al tuo, chiunque può aiutarti? http://stackoverflow.com/questions/6596567/synchronize-two-nsscrollview – disorderdev

risposta

-4

Si imposta scrollView.contentOffset = CGPointMake (0,0). O secondo il vostro requisito Imposta contectoffset dopo aver cambiato l'immagine.

+2

Solo UIScrollView ha una proprietà contentOffset. NSScrollView no. –

0

La mia soluzione hacky. Attiva Show Vertical Scroller (come ha detto Chetan, questo è ciò che fa scattare il bug). Invia vista tabella al retro. Espandi il bordo sinistro della vista tabella fino a quando lo scroller non è coperto da quello che si trova sul lato destro di esso.

8

Nick, grazie per il tuo codice. Ho modificato il tuo codice e ora funziona bene. Innanzitutto, è necessario scorrere lo scroller verticale verso l'alto. In secondo luogo, scorrere la vista del contenuto.

// 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

Grazie! Ha funzionato per me! – Developer

+0

Ha funzionato perfettamente anche per me, grazie! – Chris

+0

Grazie! gah questa è la cosa che finalmente ha funzionato ... ora ho bisogno di capire perché scrollToPoint: funziona sempre, ma scrollPoint: e scrollRectToVisible: a volte sono problematici. –

3

per aggirare questo bug è sufficiente per attivare le scroller e quindi impostare la proprietà nascosta dei scroller. Come NSScrollers ereditano da NSView questo solo impedisce loro di mostrare se stessi:

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

Opere per me almeno. Solo testato su OS 10.7.2 però.

Qualcuno ha un radar archiviato su questo uno btw? Non lo aggiusteranno se nessuno glielo dice. :)

+1

Funziona, ma devi stare attento quando imposti la proprietà 'hidden'. Apparentemente, 'windowDidLoad' è troppo presto, per esempio. – jmk

2

Sembra che io possa usare reflectScrolledClipView: invece di impostare i valori degli scroller per sincronizzare la posizione. Ex.

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

su MacOS Sierra, [_scrollView.contentView scrollToPoint:]; era buggy e stava causando sfarfallio irregolare. Tuttavia usando [_scrollView.documentView scrollPoint:] ho risolto tutti questi problemi per me. Questo è anche il metodo suggerito da Apple nel loro tutorial trovato here.