美文网首页
快捷键:NSViewController监听键盘事件

快捷键:NSViewController监听键盘事件

作者: 本帅不良 | 来源:发表于2021-01-27 10:59 被阅读0次

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

          本文链接:https://www.haomeiwen.com/subject/emiozktx.html