首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在NSScrollView中设置放大和缩小动画以使其平滑?

如何在NSScrollView中设置放大和缩小动画以使其平滑?
EN

Stack Overflow用户
提问于 2020-05-27 06:28:56
回答 2查看 137关注 0票数 0

下面是我用来设置滚动视图documentView的新大小的函数,但是我不知道如何将框架大小的变化与滚动位置的变化结合起来。如果我按原样对事物应用动画,大小会发生变化,图像会相对于左下角移动,然后图像会滚动回原来的位置。我如何组合动画,使大小变化和滚动位置一起变化-或任何其他方式来实现平滑的放大/缩小。

代码语言:javascript
运行
复制
func zoomIn(zoomFactor: CGFloat = zoomFactor){

        guard let docView = self.docView, let scrollView = self.scrollView else {
            return
        }

        let visible = scrollView.documentVisibleRect
        let newrect = NSInsetRect(visible, NSWidth(visible)*(1 - 1/zoomFactor)/2.0, NSHeight(visible)*(1 - 1/zoomFactor)/2.0);
        let frame = docView.frame

        self.execZoom(docView: docView,
                      size:CGSize(width: zoomFactor, height: zoomFactor),
                      frame:CGRect(x: 0, y: 0, width: frame.size.width * zoomFactor, height: frame.size.height * zoomFactor),
                      origin:newrect.origin)

    }
    func zoomOut(zoomFactor: CGFloat = zoomFactor){
        guard let docView = self.docView, let scrollView = self.scrollView else {
            return
        }
        let visible = scrollView.documentVisibleRect
        let newrect = NSOffsetRect(visible, -NSWidth(visible)*(zoomFactor - 1)/2.0, -NSHeight(visible)*(zoomFactor - 1)/2.0)

        let frame = docView.frame

        self.execZoom(docView: docView,
                      size: CGSize(width: 1/zoomFactor, height: 1/zoomFactor),
                      frame: CGRect(x: 0, y: 0, width: frame.size.width / zoomFactor, height: frame.size.height / zoomFactor),
                      origin: newrect.origin)
    }
    func execZoom(docView: NSView, size: CGSize, frame: CGRect, origin: CGPoint){

            docView.scaleUnitSquare(to: size)

            docView.frame = frame

            docView.scroll(origin)

    }
EN

回答 2

Stack Overflow用户

发布于 2020-06-17 13:20:14

有一个使用泛型'animated‘的简单方法。

文档中的内容:要设置放大动画,请使用对象的动画器。默认值为1.0。(https://developer.apple.com/documentation/appkit/nsscrollview/1403497-magnification?language=objc)

“使用对象的动画制作”是什么意思?

而不是:

代码语言:javascript
运行
复制
self.scrollView.setMagnification(magnification, centeredAt: point)

调用它的动画师:

代码语言:javascript
运行
复制
self.scrollView.animator().setMagnification(magnification, centeredAt: point)
票数 1
EN

Stack Overflow用户

发布于 2020-05-27 07:14:40

好的,把所有这些都扔掉,然后做这个……令人抓狂的速度,流畅,所有底层的CALayers图像和可拖动的CALayers,使用他们自己的draw()方法渲染,似乎是以矢量格式缩放-没有字体,线条或图像的像素化。

代码语言:javascript
运行
复制
   override func scrollWheel(with event: NSEvent) {

        guard event.modifierFlags.contains(.option) else {
            super.scrollWheel(with: event)
            return
        }

        let dy = event.deltaY
        if dy != 0.0 {

            let magnification = self.scrollView.magnification + dy/30
            let point = self.scrollView.contentView.convert(event.locationInWindow, from: nil)

            self.scrollView.setMagnification(magnification, centeredAt: point)
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62032442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档