How do you animate a scroll and zoom atomically?
I have a custom view in my application, which is layer-backed and embedded in an NSScrollView
. I allow the user to zoom in (which is accomplished by increasing the size of my custom view). I'm having trouble zooming in on an arbitrary point, though, since the NSScrollView
keeps getting in the way and causing the view to jump around (typically to the view's origin) before I point it to the new scroll point. I would really like to use a CAScrollLayer
, since I know I could definitely get the zooming right with it and have it move smoothly, but then I lose all built-in scrolling facilities.
Is there any way to leverage CAScrollLayer
within an NSScrollView
, possibly backing the NSClipView
? If not, what purpose does CAScrollLayer
actually serve? Is it 开发者_开发百科possible, with a different approach, to change my view's size and the scroll point atomically and have that animate?
In short, is CAScrollLayer
completely useless, or mostly useless?
Update
I've gotten my inner view to jump around less by making a CALayer
subclass to display my view's contents. Rather than sizing with layout constraints, I have it sizing in an override of -resizeWithOldSuperlayerSize:
. I still can't change the frame size and origin of my view simultaneously and get a smooth animation, though. To get a sense of what I'm looking for, open an image in Preview and zoom in and out. It zooms about the center of the image in a smooth manner.
In the limit, you can use an NSScroller
instead; that way you would be able to use CAScrollLayer
, if that’s your preferred implementation.
Note that on some (older) versions of Mac OS X, NSScroller
has a bug that causes it to invoke an Apple private method on its containing view. You’ll know if this happens because you’ll get an exception about your custom view not responding to a method starting with an ‘_
’.
精彩评论