2015-06-14 46 views
0

埃爾卡皮坦的Xcode 7測試使用夫特2.0,我一個子類如NSViewNSCollectionView的項目視圖的原型圖的使用,並重寫updateTrackingAreas:方法做鼠標跟蹤。 NSCollectionViewNSPopover內。updateTrackingAreas:覆蓋僅適用於前2次?

調試日誌顯示,似乎只會調用updateTrackingAreas:的前2次。該代碼是這樣的:

override func updateTrackingAreas() { 

    Swift.print("updateTrackingAreas:") 

    if trackingArea != nil { 
     self.removeTrackingArea(trackingArea!) 
    } 

    trackingArea = NSTrackingArea(
     rect: self.bounds, 
     options: [NSTrackingAreaOptions.MouseEnteredAndExited, NSTrackingAreaOptions.ActiveAlways], 
     owner: self, 
     userInfo: nil 
    ) 

    if trackingArea != nil { 
     self.addTrackingArea(trackingArea!) 
    } 

    var mouseLocation = self.window?.mouseLocationOutsideOfEventStream 

    mouseLocation = self.convertPoint(mouseLocation!, fromView: nil) 

    if CGRectContainsPoint(self.bounds, mouseLocation!) { 
     mouseEntered(NSEvent()) 
    } else { 
     mouseExited(NSEvent()) 
    } 

    super.updateTrackingAreas() 
} 

第2次酥料餅被打開時,我可以看到控制檯日誌顯示updateTrackingAreas:。然後跟蹤失敗,也沒有日誌。

編輯:

當我註釋掉這一部分,如:

//var mouseLocation = self.window?.mouseLocationOutsideOfEventStream 

mouseLocation = self.convertPoint(mouseLocation!, fromView: nil) 

if CGRectContainsPoint(self.bounds, mouseLocation!) { 
    mouseEntered(NSEvent()) 
} else { 
    mouseExited(NSEvent()) 
} 

將不再存在的問題。

而下面的代碼是沒有區別:

if let window = self.window { 
    var mouseLocation = window.mouseLocationOutsideOfEventStream 
    mouseLocation = self.convertPoint(mouseLocation, fromView: nil) 
    if let event = NSApplication.sharedApplication().currentEvent { 
     if NSPointInRect(mouseLocation, self.bounds) { 
      mouseEntered(event) 
     } else { 
      mouseExited(event) 
     } 
    } 
} 

編輯2:

好吧,我只是重新安裝OS X Yosemite和在Xcode 7測試版1,上述問題不再重新編譯它存在。可能只是El Capitan的一個bug。我會把它報告給蘋果公司。謝謝你們。

+2

爲什麼你需要在這個方法中進行命中測試?爲什麼不能以通常的方式處理mouseEntered和mouseExited事件? –

+0

因爲當你在視圖上滾動時,'mouseEntered:'和'mouseExited:'將被忽略。問題不是關於我爲什麼這麼做的原因,而是爲什麼它沒有在第三次工作。 –

+0

你做這件事的原因很重要,因爲你的代碼沒有按你期望的方式工作。您的問題的答案可能是您的問題無論如何都是錯誤的思路(即您的方法和/或假設可能有缺陷)。不要對自己想要的答案進行防禦 - 或者更糟糕 - 固執己見 - 用我們對自己期望的相互尊重來對待我們,並回答我們自己的澄清要求。 –

回答

1

好吧,我只是重新安裝OS X 約塞米蒂的Xcode 7公測1 的問題不再存在重新編譯它。

可能只是一個埃爾卡皮坦的錯誤。已經報告給蘋果公司。

謝謝大家。

2

您正在將新創建的事件實例傳遞給mouseEntered()mouseExited()。我意識到這是因爲您無法在該方法的Swift變體中傳遞零,但也許您應該通過當前事件(NSApplicationNSWindow都有currentEvent()方法)。你試過這個嗎?

+0

我更新了我的問題帖子中的代碼。第一個'updateTrackingAreas:'甚至沒有在第三次打印。但是,謝謝你的信息。 :) –

+0

我相信我只是這樣說的:「我意識到這是因爲你不能通過零......」請重讀我的答案。 –

+0

我的不好。謝謝。 :p –

1

在updateTrackingAreas中檢查mouseLocation是毫無意義的。

updateTrackingAreas文檔:

當視圖的幾何形狀的變化,從而需要重新計算其跟蹤區域自動調用。

這通常是由於框架的改變。當您查看其框架或位置的變化時,它將被多次調用。我懷疑你在視圖上實現了實時大小調整/移動功能,這是鼠標在視圖框架內的唯一方式,可以成爲視圖幾何變化的源頭。

+0

視圖每次出現在相同的位置,並且大小固定。此外,它並沒有解釋爲什麼它總是不能在第三次工作。並且由於'updateTrackingAreas:'被覆蓋並且被調用super.updateTrackingAreas(),它不應該在沒有任何錯誤日誌或排序的情況下影響結果嗎? –

+0

無關緊要,幾何圖形也可能在將視圖設置爲子視圖時發生變化。如果您僅實例化一次彈出窗口,則必須有一些緩存視圖。鼠標跟蹤是否在第三次停止工作? –

+0

是的,每3次。有沒有辦法來防止緩存?就像一個強制'needDisplay = true'來確保它是原因?如果是這樣,滾動時是否有其他的方式來跟蹤? –