我有一个NSView(myView)包装在NSScrollView(myScrollView)中。使用放大/缩小按钮,用户可以改变myView的比例。如果用户当前正在滚动到myView中的特定位置,我想在缩放发生后将该部分视图保留在屏幕上。如何在更改比例尺时在NSScrollView中保持滚动位置?
我有代码看起来像这样:
// 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]];
而且似乎有点接近,但它并不完全正确的,我想不出我做错了什么。我的两个问题是:
1)是不是有一个内置的线沿线的东西:
[myView adjustScaleBy: 0.5 whilePreservingLocationInScrollview:myScrollView];
2)如果没有,任何人都可以看到我在做什么错在我“很长的路要走周围“的方法,以上?
谢谢!
我想要的效果是:假设我正在看屏幕中间。当我放大(或-out)时,将它保留在屏幕中间。 谢谢! – Olie 2009-09-22 20:57:32
优秀的答案!在将视图滚动到计算出的原点后,我没有在滚动条上设置floatValue,而是在我的滚动视图上调用了reflectScrolledClipView:。这似乎让滚动条处于正确的位置。不知道这是否正确,因为这是我创建的第一个Mac应用程序,但它适用于我。 – afarnham 2013-08-13 15:16:45