快捷键:NSViewController监听键盘事件

案例:制作一个图片浏览器,需要支持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

你可能感兴趣的:(快捷键:NSViewController监听键盘事件)