如何使用Option +鼠标滚动事件平滑缩放视图

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

我正在尝试使用鼠标滚动+ Option键实现平滑的放大和缩小,但不知道如何执行此操作。

当前,我有一个ViewController,它设置要缩放的视图的框架大小,该框架大小托管在NSScrollView中。

但是这会带来非常不稳定的缩放体验-在使用鼠标滚轮时,是否有人建议过如何实现良好的平滑缩放

/// Capture mouse scroll wheel events and send to zoom function with mouse location
    /// so we can zoom in to the location
    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 {

            self.scrollZoom(dy, location: event.locationInWindow)

        }
    }

    func scrollZoom(_ delta: CGFloat, location: CGPoint) {

        zoom += delta * scrollZoomSpeedMultiplier

        let frame = caLayoutView.frame
        let newSize = CGSize(width: frame.width*zoom, height: frame.height*zoom)
        let newOrigin = frame.origin // Need to calculate the origin but for now just get smooth zoom to work

        caLayoutView.animator().frame = CGRect(origin: newOrigin, size: newSize)

    }
macos zoom
1个回答
0
投票

好,所以这完全荒谬-我已经花了几天的时间。而且所有底层CALayer和图像均按矢量缩放-此处没有像素化位图缩放。它的速度非常快,没有卡顿或犹豫。对我来说,缩放和放大是两个不同的原因,这就是为什么我以前从未考虑过这一点-我确信我确实做过,并且出现了一些像素化的混乱-我的糟糕。希望这可以节省一些时间。

仅供参考,我在后台CALayer中渲染了一个大pdf,然后在其自己的CALayer中分别添加了100+个可拖动对象。现在,事情可以像任何高端图形包一样平滑,缩放和移动。 Affinity Designer等。

仍然感到震惊,等待所有事情变得疯狂。

   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)
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.