案例:制作一个图片浏览器,需要支持
command
++
/-
实现图片放缩。
NSViewController如何监听键盘事件?
NSEvent.addLocalMonitorForEvents(matching: .keyDown) { (event) -> NSEvent? in
//1:
print("按下键盘编码:",event.keyCode)
//2:
if event.modifierFlags.intersection(.deviceIndependentFlagsMask) == .command {
//3:
if event.keyCode == 24 {
print("放大")
self.bigger()
}
//4:
if event.keyCode == 27 {
print("缩小")
self.smaller()
}
}
return event
}
我们在viewDidLoad
或者viewWillAppear
中写上这段代码即可是实现对键盘的监听
1、可以通过控制台打印的“按下键盘编码:”得知你按下的键盘的keyCode
2、event.modifierFlags.intersection(.deviceIndependentFlagsMask) == .command
是用来判断我们是否按下了辅助键command
3、keyCode==24,表示按下=
,即“+”
4、keyCode==27,表示按下-
,即“-”
扩展
如同通知需要在适当的位置移除通知一样,我们需要移除监听,否则页面关闭了,还在监听键盘。需要用到的方法是:
@available(macOS 10.6, *)
open class func removeMonitor(_ eventMonitor: Any)
下面展示完整的用法:
class ShowImageVC: NSViewController {
var monitor1 : Any?
// var monitor2 : Any?
override func viewWillAppear() {
super.viewWillAppear()
monitor1 = NSEvent.addLocalMonitorForEvents(matching: .keyDown) { (event) -> NSEvent? in
print("按下键盘编码:",event.keyCode)
if event.modifierFlags.intersection(.deviceIndependentFlagsMask) == .command {
if event.keyCode == 24 {
print("放大")
self.bigger()
}
if event.keyCode == 27 {
print("缩小")
self.smaller()
}
}
return event
}
// monitor2 = NSEvent.addLocalMonitorForEvents(matching: .flagsChanged) { (event) -> NSEvent? in
// print("控制键盘:",event.keyCode)
// print("控制键盘:",event.modifierFlags)
// return event
// }
}
override func viewWillDisappear() {
super.viewWillDisappear()
NSEvent.removeMonitor(monitor1)
// NSEvent.removeMonitor(monitor2)
}
//放大
func bigger() {
let radio : CGFloat = 11.0/10
self.imgW.constant *= radio
self.imgH.constant *= radio
}
//缩小
func smaller() {
let radio :CGFloat = 10.0/11
self.imgW.constant *= radio
self.imgH.constant *= radio
}
}
代码解读:
1、需要注意全局变量monitor1
,是用来移除监听的。
2、需要注意调用的位置,建议:如果在viewWillAppear
中调用,则在viewWillDisappear
中移除;如果是在viewDidLoad
中调用,则在deinit
中移除
如上所示,我们在viewWillAppear
中添加监听,viewWillDisappear
中移除监听。
参考:
1、https://stackoverflow.com/questions/32446978/swift-capture-keydown-from-nsviewcontroller
2、https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/EventOverview/HandlingKeyEvents/HandlingKeyEvents.html
3、https://www.cnblogs.com/wuotto/p/12083569.html
4、https://stackoverflow.com/questions/55104573/nsevent-leak-for-key-down-in-macos
网友评论