LoginSignup
6
5

More than 5 years have passed since last update.

Tips: 非アクティブなWindowの最初のマウスイベントを感知する

Last updated at Posted at 2016-02-14

タイトルの文章だとちょっとわかりにくいと思うので、困ってたことと解決策を書きます。

困っていた状況

  1. 自分のOSXアプリを起動中、他のアプリがアクティブになっている状態で、自分のアプリにマウスイベント(例:クリック)を加える
  2. 最初のマウスイベントでは自分のアプリがアクティブになるけど、Viewのイベントは発生しない。
  3. 以降のマウスイベントではViewのイベントは発生する。

ウィンドウが非アクティブな状態でもマウスのファーストタッチでイベント発生する方法ないかなーと思っていたら簡単に解決できる方法がありました。

解決策

マウスイベントを受け取りたいNSViewのサブクラスにacceptsFirstMouse:メソッドを実装し、戻り値をtrueにする。

サンプル

作ったもの

acceptsFirstMouse: の戻り値が true / false なSampleViewをそれぞれ作ります。
各ViewはmouseDown:イベントを受け取るとアラートを表示します。

ソース

sample.swift
import Cocoa

class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let view = SampleView(frame: CGRectMake(100,100,100,100))
        let view2 = SampleView2(frame: CGRectMake(250,100,100,100))
        self.view.addSubview(view)
        self.view.addSubview(view2)
    }
}

class SampleView: NSView {
    override func drawRect(dirtyRect: NSRect) {
        super.drawRect(dirtyRect)
        NSColor.redColor().set()
        NSRectFill(dirtyRect)
    }

    override func mouseDown(theEvent: NSEvent) {
        let alert = NSAlert()

        alert.messageText = "alert!"
        alert.runModal()
    }

    override func acceptsFirstMouse(theEvent: NSEvent?) -> Bool {
        return true
    }
}

class SampleView2: NSView {
    override func drawRect(dirtyRect: NSRect) {
        super.drawRect(dirtyRect)
        NSColor.blueColor().set()
        NSRectFill(dirtyRect)
    }

    override func mouseDown(theEvent: NSEvent) {
        let alert = NSAlert()

        alert.messageText = "alert!"
        alert.runModal()
    }

    override func acceptsFirstMouse(theEvent: NSEvent?) -> Bool {
        return false
    }
}

結果

SampleView(赤いView)は非アクティブな状態でもクリックするとアラートが表示されます。
SampleView2(青いView)は非アクティブな状態からクリックするとアラートが表示されません。
アクティブになった状態でクリックするとアラートが表示されます。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5