gpt4 book ai didi

cocoa - 更改比例时如何保持 NSScrollView 中的滚动位置?

转载 作者:行者123 更新时间:2023-12-03 16:02:44 24 4
gpt4 key购买 nike

我有一个 NSView (myView) 包裹在 NSScrollView (myScrollView) 中。使用放大/缩小按钮,用户可以更改 myView 的比例。如果用户当前滚动到 myView 中的特定位置,我希望在缩放后将 View 的该部分保留在屏幕上。

我的代码如下所示:

    // 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)如果没有,任何人都可以看到我在上面的“长途”方法中做错了什么吗?

谢谢!

最佳答案

缩放后保持相同的滚动位置并不容易。您需要确定的一件事是“相同”的含义 - 您希望缩放前可见区域的顶部、中间或底部在缩放后保持在原位吗?

或者,更直观地,您是否希望在可见矩形下保持一定百分比的位置等于您开始时向下滚动文档的百分比(例如,滚动条拇指的中心不在音阶过程中向上或向下移动,拇指只会增大或缩小)。

如果你想要后一种效果,一种方法是获取NSScrollView的verticalScroller和horizo​​ntalScroller,然后读取它们的'floatValue'。这些值从 0 到 1 进行标准化,其中“0”表示位于文档顶部,1 表示位于文档末尾。向滚动器询问这个问题的好处是,如果文档比 NSScrollView 短,则滚动器在所有情况下仍然会为“floatValue”返回一个合理的答案,因此您不必对此进行特殊处理。

调整大小后,将 NSScrollView 的滚动位置设置为与缩放之前相同的百分比 - 但遗憾的是,这是我挥手的地方。我已经有一段时间没有在代码中这样做了,但我记得你不能直接设置 NSScrollers 的“floatValue”——它们看起来会滚动,但实际上不会影响 NSScrollView。

因此,您必须编写一些数学函数,根据您想要通过的百分比来计算文档中新的左上角点 - 例如,在 y 轴上,它看起来像,“如果文档现在比 ScrollView 的 contentView 短,则滚动到点 0,否则滚动到文档下方的 ((contentView 高度 - documentView 高度) * oldVerticalPercentage) 点。” X轴当然是类似的。

此外,我几乎肯定您不需要在这里调用 -display ,并且通常不应该调用它。 (-setNeedsDisplay:最多。)

-威尔

关于cocoa - 更改比例时如何保持 NSScrollView 中的滚动位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1296920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com