我正在尝试使用鼠标滚动+ 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)
}
好,所以这完全荒谬-我已经花了几天的时间。而且所有底层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)
}
}