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

时间:2015-02-05 04:39:56

标签: objective-c macos cocoa trackpad

如何在MacBook触控板上检测两个手指缩放手势? (在选定的NSView中)

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

一个简单快捷的解决方案:

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 (Aka Pinch输入/输出缩放)

围绕这种方法的更多信息和研究:
http://eon.codes/blog/2016/02/10/Gesture-research/

答案 2 :(得分:2)

更新的Swift解决方案

由于deltaZ似乎已被弃用,因此eonist的答案似乎已过时(我使用macOS 10.13.6 aka 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)
}