updateTrackingAreas:覆盖仅适用于前2次?

时间:2015-06-14 19:05:31

标签: objective-c xcode macos swift cocoa

使用 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报告。谢谢大家。

3 个答案:

答案 0 :(得分:2)

您正在将新创建的事件实例传递给mouseEntered()mouseExited()。我意识到这是因为你不能在方法的Swift变体中传递nil,但也许你应该传递当前事件(NSApplicationNSWindow都有currentEvent()方法) 。你试过这个吗?

答案 1 :(得分:1)

检查updateTrackingAreas中的mouseLocation是没有意义的。

来自updateTrackingAreas的文档:

  

当视图的几何体发生变化时,会自动调用,以便需要重新计算其跟踪区域。

这通常是由于帧的变化。当您查看其框架或位置的更改时,将多次调用它。我怀疑你是否在视图上实现了实时调整大小/移动功能,这是视图框架内鼠标可以成为视图几何变化源的唯一方法。

答案 2 :(得分:1)

好的,我只是重新安装OS X Yosemite 并使用 Xcode 7 beta 1重新编译它。问题不再存在。

可能只是El Capitan的一个错误。已经向Apple报告了。

谢谢大家。