Ho un NSView (myView) avvolto in un NSScrollView (myScrollView). Usando i pulsanti di zoom in/out, l'utente può modificare la scala di myView. Se l'utente è attualmente spostato su un punto particolare in myView, vorrei mantenere quella parte della vista sullo schermo dopo che lo zoom è avvenuto.Come mantenere la posizione di scorrimento in NSScrollView quando si modifica la scala?
Ho codice che assomiglia a questo:
// preserve current position in scrollview
NSRect oldVisibleRect = [[myScrollView contentView] documentVisibleRect];
NSPoint oldCenter = NSPointFromCGPoint(CGPointMake(oldVisibleRect.origin.x + (oldVisibleRect.size.width/2.0),
oldVisibleRect.origin.y + (oldVisibleRect.size.height/2.0)));
// adjust my zoom
++displayZoom;
[self scaleUnitSquareToSize:NSSizeFromCGSize(CGSizeMake(0.5, 0.5))];
[self calculateBounds]; // make sure my frame & bounds are at least as big as the visible content view
[self display];
// Adjust scroll view to keep the same position.
NSRect newVisibleRect = [[myScrollView contentView] documentVisibleRect];
NSPoint newOffset = NSPointFromCGPoint(CGPointMake((oldCenter.x * 0.5) - (newVisibleRect.size.width/2.0),
(oldCenter.y * 0.5) - (newVisibleRect.size.height/2.0)));
if (newOffset.x < 0)
newOffset.x = 0;
if (newOffset.y < 0)
newOffset.y = 0;
[[myScrollView contentView] scrollToPoint: newOffset];
[myScrollView reflectScrolledClipView: [myScrollView contentView]];
e sembra una sorta di stretta, ma non è giusto e non riesco a capire cosa sto facendo male. Le mie due domande sono:
1) Non v'è un built-in qualcosa sulla falsariga di:
[myView adjustScaleBy: 0.5 whilePreservingLocationInScrollview:myScrollView];
2) In caso contrario, qualcuno può vedere quello che sto facendo di sbagliato nel mio "modo lungo intorno "approccio, sopra?
Grazie!
L'effetto che voglio è: supponiamo che stia guardando il centro dello schermo. Mentre eseguo lo zoom in avanti (o -out), mantieni quella cosa al centro dello schermo. Grazie! – Olie
Ottima risposta! Invece di impostare il floatValue sugli scroller dopo aver spostato la mia vista sull'origine calcolata, ho chiamato reflectScrolledClipView: sulla mia vista scroll. Questo sembra avere le barre di scorrimento nella giusta posizione. Non sono sicuro se questo è corretto in quanto questa è la prima app per Mac che ho creato, ma funziona per me. – afarnham