macOS:鼠标单击带修饰键的MKAnnotationView

时间:2017-03-22 16:29:29

标签: swift macos mkmapview mapkit

在我的macOS应用程序中,我想在MKMapView中实现以下行为:

  1. 鉴于我有一个带有多个注释的mapView 当用户单击注释时 然后选择注释 并且取消选择先前选择的注释

  2. 鉴于我有一个带有多个注释的mapView 当用户单击持有cmd键的注释时 然后将注释添加到当前选择

  3. 鉴于我有一个带有多个注释的mapView 并且至少选择了一个注释 当用户单击包含cmd键的选定注释时 然后从当前选择中删除注释

  4. 我保留了一个单独的选定注释数组,因为MKMapView确实有一个selectedAnnotations属性,但是一次只包含一个注释。 第一个场景很容易实现,在mapDelegate中你可以调用didSelect方法。在这个方法中,我可以将注释添加到我选择的注释数组中。

    但情景2和3似乎是不可能的。我尝试了以下路线:

    一个。使用代表' didSelect和didDeselect方法,但问题是第二次单击(甚至不考虑键修饰符)不会导致didSelect方法的第二次调用,因为此时注释已经被选中。

    B中。对MKAnnotationView进行子类化并覆盖以下内容以接管对mapView的控制,但这会导致不显示标注,或者在单击的注释旁边的注释上显示标注等。

    override func hitTest(_ point: NSPoint) -> NSView? {
            guard let _ = mapView else {
                return nil
            }
            let lPoint = convert(point, from: superview)
            if bounds.contains(lPoint) {
                // Take our own control
                return self
            }
            else {
                // Leave to our superview (the mapView
                return nil
            }
        }
    
        override func mouseUp(with event: NSEvent) {
            NSLog("MouseDown on \(self.annotation?.title)")
            guard let lGeocache = annotation as? Geocache, let lMapView = mapView else {
                return
            }
    
            let lCacheAC = TGAppDelegate.shared().cacheArrayController
            if inSelectionSet {
                lCacheAC.removeSelectedObjects([lGeocache])
            }
            else {
                lCacheAC.addSelectedObjects([lGeocache])
            }
            // Show the callout
            lMapView.selectAnnotation(self.annotation!, animated: true)
        } 
    

    ℃。你不应该继承MKMapView,但我甚至尝试过。但是,没有合理的方法来覆盖它。

    路线B接近,但显示标注非常难以预料,因此无法接受作为解决方案。

0 个答案:

没有答案