可可 – 如何在更改比例尺时保持NSScrollView中的滚动位置?

可可 – 如何在更改比例尺时保持NSScrollView中的滚动位置?,第1张

概述我有一个包含在NSScrollView(myScrollView)中的NSView(myView).使用放大/缩小按钮,用户可以改变myView的比例.如果用户当前滚动到myView中的某个特定位置,我想在缩放发生之后在屏幕上保留该部分视图. 我的代码看起来像这样: // preserve current position in scrollview NSRect oldVisibleRe 我有一个包含在NSScrollVIEw(myScrollVIEw)中的NSVIEw(myVIEw).使用放大/缩小按钮,用户可以改变myVIEw的比例.如果用户当前滚动到myVIEw中的某个特定位置,我想在缩放发生之后在屏幕上保留该部分视图.

我的代码看起来像这样:

// 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” – 他们将LOOK滚动,但它们实际上不会影响NSScrollVIEw.

因此,您必须编写一些数学计算您的文档中的新的左上角,以您想要通过它的百分比为单位,例如,在y轴上,它将如下所示:“如果文档现在比scrollVIEw的contentVIEw更短,滚动到点0,否则滚动到文档的((contentVIEw的高度,documentVIEw的height)* oldVerticalPercentage)的点. X轴当然是相似的.

此外,我几乎是积极的,你不需要在这里显示 – 显示,一般不应该永远称之为. (-setNeedsdisplay:最多)

-会

总结

以上是内存溢出为你收集整理的可可 – 如何在更改比例尺时保持NSScrollView中的滚动位置?全部内容,希望文章能够帮你解决可可 – 如何在更改比例尺时保持NSScrollView中的滚动位置?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1029308.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存