如何在 Macbook trackpad 上检测双指缩放手势?(在选定的 NSView 中)
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解决方案
看起来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)
}
有一个事件类型 (NSEventTypeMagnify
) 用于捏合手势,以及一个 NSResponder
方法 (-magnifyWithEvent:
) 用于处理这些事件。在这方面,Cocoa与Cocoa Touch略有不同;在桌面上,通常让操作系统为您解释手势,而您会响应手势的含义而不是试图识别手势本身。