如何在NSScrollView中进行动画放大和缩小,使其平滑?

问题描述 投票:0回答:1

下面是我用来设置滚动视图documentView的新大小的函数,然而我想不出如何将帧大小的变化与滚动位置的变化结合起来。 如果我按事物的现状应用动画,大小就会发生变化,图像相对左下角移动,然后图像就会滚动回原位。 我如何将动画结合起来,使大小变化和滚动位置一起变化--或任何其他方法来实现平滑的放大缩小。

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)

    }
zoom nsscrollview
1个回答
0
投票

好吧,就把所有的东西扔掉,然后这样做......疯狂的快速,流畅,所有的底层CALayers与图像和可拖动的CALayers用自己的draw()方法渲染,似乎以矢量格式缩放--没有字体,线条或图像的像素化。

   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
投票

有一个简单的方法来使用通用的 "动画"。

从文档中可以看出。要对放大倍数进行动画处理,请使用对象的动画器。默认值是1.0。(https:/developer.apple.comdocumentationappkitnsscrollview1403497-magnification?语言=objc。)

什么叫'使用对象的动画器'?

而不是:

self.scrollView.setMagnification(magnification, centeredAt: point)

而不是:"调用它的动画器

self.scrollView.animator().setMagnification(magnification, centeredAt: point)
© www.soinside.com 2019 - 2024. All rights reserved.