? ? ? ?跟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);
}
```