2013-07-18 46 views
3

在10.7+項目中,當鼠標位於集合視圖項目視圖的界限內時,我試圖在NSCollectionViewItem中啓用UI元素。對於該填充NSCollectionView每個集合視圖項目,我一直在使用它的界限它創建一個單獨的NSTrackingArea自定義視圖:直到NSCollectionView內容滾動鼠標在NSCollectionView + NSScrollView

- (void) initializeMouseTracking 
{ 
    self.trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] options:NSTrackingMouseEnteredAndExited|NSTrackingActiveAlways owner:self userInfo:nil]; 
    [self addTrackingArea:self.trackingArea]; 

    NSPoint mouseLocation = [[self window] mouseLocationOutsideOfEventStream]; 
    mouseLocation = [self convertPoint: mouseLocation fromView: nil]; 

    if (NSPointInRect(mouseLocation, [self bounds]) == YES) 
    { 
     [self mouseEntered:nil]; 
    } 
    else 
    { 
     [self mouseExited:nil]; 
    } 
} 

跟蹤區域工作的偉大。顯然,跟蹤區域需要在滾動期間和滾動後重置。 我試圖無效並重新創建NSTrackingAreas在幾個方面:

- (void) resetMouseTracking 
{ 
    [self removeTrackingArea:self.trackingArea]; 
    [self initializeMouseTracking]; 
} 


- (void) scrollWheel:(NSEvent *)theEvent 
{ 
    [self resetMouseTracking]; 
    [super scrollWheel:theEvent]; 
} 


- (void) viewDidMoveToWindow:(NSWindow *)newWindow 
{ 
    [self resetMouseTracking]; 
    [super viewWillMoveToWindow:newWindow]; 
} 


- (void) updateTrackingAreas 
{ 
    [self resetMouseTracking]; 
    [super updateTrackingAreas]; 
} 

但不僅這些嘗試滾動(ALA滾輪:)似乎是不必要期間有不完整的和馬車的結果,跟蹤區域的不斷重新計算。相反,有一個有效的方法來捕獲滾動事件的發生和偏移(在iOS中很容易),這樣我就可以在滾動期間使所有跟蹤區無效。在scrollview的contentView上使用NSViewBoundsDidChangeNotification告訴我滾動正在發生,但並不表示它何時啓動或停止。

從NSScrollView滾動開始和結束通知需要深層次的子類化還是有其他東西我忽略?它有一個完全不同的方法,顯示更多的承諾?

+0

更多類似的比較,我決定使用一個不同的解決方案,在這裏我用一個單一的跟蹤區域上含有NSCollectionView的NSScrollView子類的範圍。在mouseMoved中:我查詢了鼠標在查詢集合視圖及其原型視圖後盤旋的集合視圖項的索引,並從NSClipView中獲取了documentVisibleRect。然後,我通過集合視圖項目發送適當的視圖。剩下的唯一問題是收集視圖項目在滾動期間不會更新。但是,滾動完成後,鼠標懸停在預期的作品上。 – ctpenrose

回答

-1

一種不同的方法...一個NSView繼承NSResponder類。 NSResponder具有「mouseEntered:」和「mouseExited:」方法。我的建議是儘可能使用NSView子類中的那些子類,並跳過跟蹤區域。

+2

NSTrackingArea實際上允許這兩種方法觸發,否則它們不會。我最初並沒有在我的問題中包括我的重寫的mouseEntered:和mouseExited:方法。 – ctpenrose

0

在Cocoa的滾動視圖中,與iOS不同,所有事情都在documentView(而不是contentView)上完成。 您可能需要[scrollView documentVisibleRect].origin作爲內容偏移量。

看看這個answer爲的UIScrollView和NSScrollView

+0

對不起,如果我不清楚我的問題。我有興趣在滾動開始和停止時學習,而不是獲取內容偏移量,並將其與集合視圖項目進行協調。我編輯了我的問題來反映這一點。此外,NSTrackingArea在關聯視圖的座標中使用NSRect進行初始化; NSTrackingArea在內部處理跟蹤視圖與其超級視圖的關係。眼前的問題是何時而不是何處的問題。 – ctpenrose

+0

我想你可以爲這個屬性添加一個觀察者。然後執行邏輯來檢查最後一點。這將節省你的繼承我猜。 – Rakesh