MapKit注释消失了

jva*_*van 8 mapkit ios mapkitannotation swift

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

这是我用于上述内容的代码.

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.
}
Run Code Online (Sandbox Code Playgroud)

}

Les*_*ary 11

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

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
}
Run Code Online (Sandbox Code Playgroud)


Ger*_*tan 9

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

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

view.displayPriority = .required
Run Code Online (Sandbox Code Playgroud)

设置。

您所看到的是不同规则的组合。

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

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


Jos*_*eld 6

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


小智 5

我遇到了类似的问题。我最好的猜测是,它与iOS 11如何检测到销钉冲突有关。实施自定义注释视图或还原为使用iOS 10针对我来说解决了这个问题。

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

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
   }
}
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,则有一个displayPriority值得研究的属性,因为它有助于确定何时应隐藏/显示不同缩放级别的引脚。有关更多信息,访问https://developer.apple.com/documentation/mapkit/mkannotationview/2867298-displaypriority

希望这可以帮助。