OS X Cocoa - 如何检测触控板缩放手势?
OS X Cocoa - how can one detect trackpad zoom gestures?
如何检测 MacBook 触控板上的两个手指缩放手势? (在选定的 NSView 内)
有一个用于捏合手势的事件类型 (NSEventTypeMagnify
),以及一个用于处理此类事件的 NSResponder
方法 (-magnifyWithEvent:
)。 Cocoa 在这方面与 Cocoa Touch 略有不同;在桌面上,您通常会让 OS 为您解释手势,您会对手势的含义做出反应,而不是试图识别手势本身。
一个简单的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 (又名捏合 in/out 缩放)
有关此方法的更多信息和研究:
http://eon.codes/blog/2016/02/10/Gesture-research/
已更新Swift解决方案
看起来 eonist 的回答有点过时了,因为 deltaZ 似乎已被弃用(我使用 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)
}
如何检测 MacBook 触控板上的两个手指缩放手势? (在选定的 NSView 内)
有一个用于捏合手势的事件类型 (NSEventTypeMagnify
),以及一个用于处理此类事件的 NSResponder
方法 (-magnifyWithEvent:
)。 Cocoa 在这方面与 Cocoa Touch 略有不同;在桌面上,您通常会让 OS 为您解释手势,您会对手势的含义做出反应,而不是试图识别手势本身。
一个简单的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 (又名捏合 in/out 缩放)
有关此方法的更多信息和研究:
http://eon.codes/blog/2016/02/10/Gesture-research/
已更新Swift解决方案
看起来 eonist 的回答有点过时了,因为 deltaZ 似乎已被弃用(我使用 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)
}