OS X Cocoa - 如何检测触控板缩放手势?

5
如何在 Macbook trackpad 上检测双指缩放手势?(在选定的 NSView 中)
3个回答

5

一个简单的 Swift 解决方案:

var zoom:CGFloat = 0
override func magnify(with event: NSEvent) {
    super.magnify(with: event)
    if(event.phase == .changed){
        zoom += event.deltaZ
    }else if(event.phase == .began){
        zoom = 0//reset
    }else if(event.phase == .ended){
        //Swift.print("zoom: " + "\(zoom)")
        var dir:Int
        if(zoom < -100){
            Swift.print("zoom out")
            dir = 1
        }else if(zoom > 100){
            Swift.print("zoom in")
            dir = -1
        }else{
            Swift.print("no zoom")
            dir = 0
        }
    }
}

它能够检测到缩放手势发生的+-100 deltaZ(即收拢/展开手指进行缩放)

更多相关信息和研究:
http://eon.codes/blog/2016/02/10/Gesture-research/


如何在Swift 3.0中通过按钮动作事件调用func magnify(with event: NSEvent)函数。 - ronak patel
为什么我们需要在这里使用super调用? - Bohdan Savych
@Bohdan Savych 嗯,我不认为这是委托。如果你重写了它,转发事件是明智的吗? - Sentry.co

4

更新的Swift解决方案

看起来eonist的答案稍微有些过时,因为deltaZ似乎已经被弃用(我使用macOS 10.13.6即High Sierra,Xcode 9.4.1)。此解决方案适用于NSScrollView。

override func magnify(with event: NSEvent) {
    if(event.phase == .changed){
        onZoomChanged(magnification: self.magnification * (1 + event.magnification))
    }
}

func onZoomChanged(magnification: CGFloat) {
    allowsMagnification = true
    let centerPos =  documentVisibleRect.midPoint // midPoint is a simple CGRect extension
    setMagnification(magnification, centeredAt: centerPos)
}

1
变化是很好的。我的答案适用于常规的NSView,还添加了更多信息✌️ - Sentry.co

4

有一个事件类型 (NSEventTypeMagnify) 用于捏合手势,以及一个 NSResponder 方法 (-magnifyWithEvent:) 用于处理这些事件。在这方面,Cocoa与Cocoa Touch略有不同;在桌面上,通常让操作系统为您解释手势,而您会响应手势的含义而不是试图识别手势本身。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接