使用 Swift 2.0 在 Xcode 7 beta 中 El Capitan ,我将NSView
子类化为原型视图NSCollectionView
的项目视图,并覆盖updateTrackingAreas:
方法以执行鼠标跟踪。 NSCollectionView
位于NSPopover
内。
调试日志显示,似乎只调用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 beta 1再次编译它。问题不再存在。可能只是El Capitan的一个错误。我会向Apple报告。谢谢大家。
答案 0 :(得分:2)
您正在将新创建的事件实例传递给mouseEntered()
和mouseExited()
。我意识到这是因为你不能在方法的Swift变体中传递nil,但也许你应该传递当前事件(NSApplication
和NSWindow
都有currentEvent()
方法) 。你试过这个吗?
答案 1 :(得分:1)
检查updateTrackingAreas中的mouseLocation
是没有意义的。
来自updateTrackingAreas的文档:
当视图的几何体发生变化时,会自动调用,以便需要重新计算其跟踪区域。
这通常是由于帧的变化。当您查看其框架或位置的更改时,将多次调用它。我怀疑你是否在视图上实现了实时调整大小/移动功能,这是视图框架内鼠标可以成为视图几何变化源的唯一方法。
答案 2 :(得分:1)
好的,我只是重新安装OS X Yosemite 并使用 Xcode 7 beta 1重新编译它。问题不再存在。
可能只是El Capitan的一个错误。已经向Apple报告了。
谢谢大家。