你如何动画滚动和原子缩放?
Posted
技术标签:
【中文标题】你如何动画滚动和原子缩放?【英文标题】:How do you animate a scroll and zoom atomically? 【发布时间】:2011-07-08 14:57:50 【问题描述】:我的应用程序中有一个自定义视图,它由层支持并嵌入在NSScrollView
中。我允许用户放大(这是通过增加我的自定义视图的大小来实现的)。不过,我在放大任意点时遇到问题,因为NSScrollView
一直妨碍并导致视图在我将其指向新的滚动点之前跳来跳去(通常是视图的原点)。我真的很想使用CAScrollLayer
,因为我知道我肯定可以使用它进行正确的缩放并让它平滑移动,但是我失去了所有内置的滚动功能。
有没有办法在NSScrollView
中利用CAScrollLayer
,可能支持NSClipView
?如果不是,CAScrollLayer
的实际用途是什么?是否可以通过不同的方法自动更改视图的大小和滚动点并使其具有动画效果?
简而言之,CAScrollLayer
是完全没用,还是大部分没用?
更新
通过创建CALayer
子类来显示我的视图内容,我的内心视图减少了跳跃。我没有使用布局约束来调整大小,而是将其调整为覆盖-resizeWithOldSuperlayerSize:
。不过,我仍然无法同时更改视图的帧大小和原点并获得流畅的动画。要了解我要查找的内容,请在“预览”中打开图像并放大和缩小。它以平滑的方式围绕图像的中心进行缩放。
【问题讨论】:
【参考方案1】:在限制中,您可以改用NSScroller
;这样您就可以使用CAScrollLayer
,如果这是您的首选实现方式。
请注意,在某些(较旧)版本的 Mac OS X 上,NSScroller
有一个错误,会导致它在其包含的视图上调用 Apple 私有方法。您会知道是否会发生这种情况,因为您会收到关于自定义视图未响应以“_
”开头的方法的异常。
【讨论】:
NSScroller
不提供任何 UI chrome,对吗?你有什么例子可以证明它被用来达到类似的效果吗?操作系统版本不是问题,因为我需要 Lion(或者可能是 Mountain Lion,具体取决于我何时发货)。
NSScroller
是 NSScrollView
使用的,是的,它“提供 UI chrome”(如果您的意思是它负责绘制滚动条)。我们在 iDefrag 中使用它(块视图实际上是使用 OpenGL 绘制的,由于 32 位 AppKit 中 float
坐标的精度问题,我们自己进行滚动)。以上是关于你如何动画滚动和原子缩放?的主要内容,如果未能解决你的问题,请参考以下文章