【问题标题】:MapKit Annotations DisappearingMapKit 注释消失
【发布时间】:2021-05-03 07:52:09
【问题描述】:

我有一个纬度数组和另一个经度数组,我将它们添加到 CLLocationCoordinate2D 类型的数组中。然后我使用新数组来注释地图上的多个点。一些,或大部分,甚至可能所有的注释都显示在地图上,但是当我放大(是的,放大)时,一些注释会消失,然后回来,或者不显示。关于如何让它们全部可见的任何想法?这是我在缩小而不是缩小时所期望的行为。

这是我上面描述的代码。

import UIKit
import MapKit
import CoreLocation

class MultiMapVC: UIViewController, CLLocationManagerDelegate {

@IBOutlet weak var multiEventMap: MKMapView!

var latDouble = Double()
var longDouble = Double()
let manager = CLLocationManager()
var receivedArrayOfLats = [Double]()
var receivedArrayOfLongs = [Double]()
var locations = [CLLocationCoordinate2D]()


func locationManager(_ manager: CLLocationManager, didUpdateLocations uLocation: [CLLocation]) {
    let userLocation = uLocation[0]
    let span:MKCoordinateSpan = MKCoordinateSpanMake(0.3, 0.3)
    let usersLocation = userLocation.coordinate
    let region:MKCoordinateRegion = MKCoordinateRegionMake(usersLocation, span)
    multiEventMap.setRegion(region, animated: true)
    manager.distanceFilter = 1000
    self.multiEventMap.showsUserLocation = true
}

func multiPoint() {

    var coordinateArray: [CLLocationCoordinate2D] = []
    print ("Received Longitude Count = \(receivedArrayOfLongs.count)")
    print ("Received Latitude Count = \(receivedArrayOfLats.count)")
    if receivedArrayOfLats.count == receivedArrayOfLongs.count {
        for i in 0 ..< receivedArrayOfLats.count {
            let eventLocation = CLLocationCoordinate2DMake(receivedArrayOfLats[i], receivedArrayOfLongs[i])
            coordinateArray.append(eventLocation)
            print (coordinateArray.count)
        }
    }

    for events in coordinateArray {
        let annotation = MKPointAnnotation()
        annotation.coordinate = CLLocationCoordinate2D(latitude: events.latitude, longitude: events.longitude)
        multiEventMap.addAnnotation(annotation)
        }
}


override func viewDidLoad() {
    super.viewDidLoad()
    manager.delegate = self
    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.requestWhenInUseAuthorization()
    manager.startUpdatingLocation()
    multiPoint()
        }


override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    multiEventMap.removeFromSuperview()
    self.multiEventMap = nil

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

【问题讨论】:

  • 请分享您的代码viewFor注解方法
  • 我遇到了同样的问题,它似乎只存在于 iOS 11 中。
  • 我更新为包含我的 VC 中的所有代码。但我没有 viewForAnnotation 方法。
  • iOS 13 上仍然存在。

标签: ios swift mapkit mapkitannotation


【解决方案1】:

NiltiakSivad 的解决方案有效,但它恢复到旧的 iOS 10 外观。如果您想为 iOS 11 保留新的 iOS 11 气球标记并仅对旧 iOS 版本使用旧的 pin 外观,那么您可以实现如下委托方法:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    let reuseIdentifier = "annotationView"
    var view = mapView.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier)
    if #available(iOS 11.0, *) {
        if view == nil {
            view = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier)
        }
        view?.displayPriority = .required
    } else {
        if view == nil {
            view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier)
        }
    }
    view?.annotation = annotation
    view?.canShowCallout = true
    return view
}

【讨论】:

  • 这实际上可能是Apple的一个错误,因为默认显示优先级应该是.required(但显然不是!)
  • (顺便说一句,你不应该将另一个答案称为“高于”或“低于”,因为它们的顺序会根据他们的评级而变化。相反,你应该写“NiltiakSivad 的解决方案”。我会编辑你的相应地回答。)
【解决方案2】:

Leszek Szary 接受的答案是正确的。

但是有一些细则。有时MKMarkerAnnotationViews 不会被渲染,即使

view.displayPriority = .required

已设置。

你看到的是不同规则的组合。

  1. MKAnnotationViews 从地图的顶部到底部呈现。 (北在哪里并不重要)。
  2. 如果MapKit 决定绘制重叠的MKAnnotationViews,则靠近底部的MKAnnotationView 将绘制在顶部(因为它是稍后绘制的)
  3. 不仅MKAnnotationViews,在MKMArkerAnnotationViews下方呈现的标题也需要空间。这些标题的呈现受markerView.titleVisibility 的影响。如果markerView.titleVisibility 设置为.visible(而不是默认的.adaptive),那么这个标题比稍后渲染的MarkerAnnotationView 强,即使后面的MarkerAnnotationViewdisplayPriority = .required。靠近底部的MarkerAnnotationView 不会被渲染。
  4. 即使靠近顶部的MarkerAnnotationView 具有较低的displayPriority,也会发生这种情况。因此,MarkerAnnotationView 与低 displayPriority.titleVisibility = .visible 可以使 MarkerAnnotationView 更接近底部,而 displayPriority = .required 消失。

我不知道有关此行为的文档。这是我在 iOS 12 上的实验结果。我的描述被简化了。

【讨论】:

    【解决方案3】:

    我遇到了类似的问题。我最好的猜测是它与 iOS 11 如何检测 pin 冲突有关。实现自定义注释视图或恢复使用 iOS 10 pin 为我解决了这个问题。

    例如,实现以下内容应该可以修复您的代码:

    class MultiMapVC: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {
       override func viewDidLoad() {
           super.viewDidLoad()
           mapView.delegate = self    
        }
    
        func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
           guard let annotation = annotation as? MKPointAnnotation else { return nil }
    
           let identifier = "pin-marker"
           var view: MKAnnotationView
    
           if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKPinAnnotationView {
               dequeuedView.annotation = annotation
               view = dequeuedView
           } else {
               view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
           }
           return view
       }
    }
    

    如果这不起作用,有一个displayPriority 属性值得研究,因为它负责帮助确定何时应在不同缩放级别隐藏/显示图钉。更多信息https://developer.apple.com/documentation/mapkit/mkannotationview/2867298-displaypriority

    希望这会有所帮助。

    【讨论】:

    • 这行得通!我注意到的一件事是这些引脚不可选择。
    【解决方案4】:

    我只在第一次分配 MKMarkAnnotationView 时设置了annotationView.displayPriority = .required。通常这就是您需要做的所有事情,但每次重复使用单元格时设置它为我解决了这个问题。

    【讨论】:

      【解决方案5】:

      我在 Xcode 10 和 iOS 12+ 作为我的部署目标时看到了类似的问题。 Apple 员工 (https://forums.developer.apple.com/thread/92839) 的帖子建议切换出队标记上的 .isHidden 属性。这改善了一些情况,但并没有完全解决问题。

      result?.isHidden = true
      result?.isHidden = false
      return result
      

      【讨论】:

        猜你喜欢
        • 2023-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多