MAC開發之鼠標懸停事件

? ? ? ?跟Windows開發不同,Mac開發下的控件沒有鼠標懸停事件,因此呢我們就需要自己定義了。然而自定義的方法有很多種,其實我們可以簡單實現,沒必要搞得很復雜,比如說全局去捕捉鼠標的位置,然后做區域判斷之類的。。。。

? ? ? 下面簡單介紹一下我的實現方法:通過把蘋果提供的mouseEntered和mouseExited事件組合起來,就可以實現鼠標的懸停事件。閑話不多說,已NSButton為例,上代碼:

```

//開啟鼠標懸停事件

-(void)openMouseOverflowEvent{

NSTrackingAreaOptionsoptions =NSTrackingMouseEnteredAndExited|NSTrackingActiveInKeyWindow;

self.mTrackingArea= [[NSTrackingAreaalloc]initWithRect:self.bounds

options:options

owner:self

userInfo:nil];

[selfaddTrackingArea:self.mTrackingArea];

}

//關閉鼠標懸停事件

- (void)closeMouseOverflowEvent{

[selfremoveTrackingArea:self.mTrackingArea];

self.mTrackingArea=nil;

}

//鼠標進入事件

-(void)mouseEntered:(NSEvent*)theEvent{

if(self.mOnMouseEnter)

self.mOnMouseEnter(self);

}

//鼠標離開事件

-(void)mouseExited:(NSEvent*)theEvent{

if(self.mOnMouseLeave) {

self.mOnMouseLeave(self);

}

}

```

? ? ? ?如代碼中所示,當鼠標進入時,就是鼠標懸停在控件之上的事件觸發之時,這時我們回調Block,同時把自己傳進去,方便外界對控件進行操作,當鼠標離開之時即懸停事件結束之時,同時調一下結束Block。

? ? ? ?開啟懸停事件的函數內所做的事情是給系統一個事件區域,也就是觸發鼠標進入與離開的區域。

? ? ? ?上面代碼有一個需要注意的地方,就是當在鼠標懸停狀態下觸發一些特殊邏輯的時候,需要注意注意事件的關閉與檢測區域的移除。比如說,當NSButton在懸停狀態下觸發了點擊事件,然后把當前包含此NSButton的view隱藏起來,這時沒有觸發鼠標的離開事件,所以需要自己注意去控制關閉懸停事件。

? ? ? ?之所以,給一個懸停開關函數,是想自己能夠隨時控制懸停事件的開始與結束,當然,你也可以把代碼改成下面這樣,調用起來會更方便一點,但是,同樣要注意事件的關閉與檢測區域的移除哦!!!

```

//鼠標進入事件

-(void)mouseEntered:(NSEvent*)theEvent{

if(self.mTrackingArea==nil)

[selfopenMouseOverflowEvent];

if(self.mOnMouseEnter)

self.mOnMouseEnter(self);

}

//鼠標離開事件

-(void)mouseExited:(NSEvent*)theEvent{

if(self.mTrackingArea==nil)

[selfcloseMouseOverflowEvent];

if(self.mOnMouseLeave)

self.mOnMouseLeave(self);

}

```

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容