gpt4 book ai didi

swift - 缩小时隐藏注释

转载 作者:行者123 更新时间:2023-12-04 16:42:25 27 4
gpt4 key购买 nike

这是我的问题:

enter image description here

当缩小并且属性 showsUserLocation 设置为 true 并且注释以用户位置为中心时,集群将在缩小时消失。我不想要这个,它们应该始终可见。 displayPriority 的默认值设置为 required 所以我不知道如何解决这个问题。 每个注释和集群都应该始终可见。当我将属性 showUserLocation 设置为 false 或确保注释/集群不在当前位置附近时,它会起作用。

有两种方法可以重现我的问题:

  1. 克隆并运行 https://github.com/Jasperav/AnnotationsGlitch
  2. 复制粘贴并运行下面的代码

代码

import UIKit
import MapKit

class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {
let mapView = MKMapView(frame: .zero)

private let locationManager = CLLocationManager()

override func viewDidLoad() {
view.addSubview(mapView)

mapView.translatesAutoresizingMaskIntoConstraints = false
mapView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
mapView.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
mapView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
mapView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
mapView.delegate = self

mapView.showsUserLocation = true
}

override func viewDidAppear(_ animated: Bool) {
let authorizationStatus = CLLocationManager.authorizationStatus()

switch authorizationStatus {
case .authorizedWhenInUse, .authorizedAlways:
break
case .notDetermined, .restricted, .denied:
locationManager.requestWhenInUseAuthorization()
@unknown default:
fatalError()
}

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) {
for _ in 0...20 {
let currentLocation = self.mapView.userLocation.coordinate
let newLocation = currentLocation.shiftRandomPosition(meters: 30000, randomMeters: true)

self.mapView.addAnnotation(Annotation(coordinate: newLocation))
}

self.mapView.setRegion(MKCoordinateRegion(center: self.mapView.userLocation.coordinate, span: MKCoordinateSpan(latitudeDelta: 0, longitudeDelta: 0)), animated: false)
}
}

func mapView(_ mapView: MKMapView, clusterAnnotationForMemberAnnotations memberAnnotations: [MKAnnotation]) -> MKClusterAnnotation {
MKClusterAnnotation(memberAnnotations: memberAnnotations)
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

}

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
guard let annotation = annotation as? Annotation else { return nil }

let identifier = "marker"
let view: MKMarkerAnnotationView

if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKMarkerAnnotationView {
dequeuedView.annotation = annotation
view = dequeuedView
} else {
view = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: identifier)
}

view.clusteringIdentifier = "identifier"


return view
}
}

class Annotation: NSObject, MKAnnotation {
let coordinate: CLLocationCoordinate2D

init(coordinate: CLLocationCoordinate2D) {
self.coordinate = coordinate

super.init()
}
}

// https://stackoverflow.com/a/55459722/7715250
extension CLLocationCoordinate2D {
/// Get coordinate moved from current to `distanceMeters` meters with azimuth `azimuth` [0, Double.pi)
///
/// - Parameters:
/// - distanceMeters: the distance in meters
/// - azimuth: the azimuth (bearing)
/// - Returns: new coordinate
private func shift(byDistance distanceMeters: Double, azimuth: Double) -> CLLocationCoordinate2D {
let bearing = azimuth
let origin = self
let distRadians = distanceMeters / (6372797.6) // earth radius in meters

let lat1 = origin.latitude * Double.pi / 180
let lon1 = origin.longitude * Double.pi / 180

let lat2 = asin(sin(lat1) * cos(distRadians) + cos(lat1) * sin(distRadians) * cos(bearing))
let lon2 = lon1 + atan2(sin(bearing) * sin(distRadians) * cos(lat1), cos(distRadians) - sin(lat1) * sin(lat2))
return CLLocationCoordinate2D(latitude: lat2 * 180 / Double.pi, longitude: lon2 * 180 / Double.pi)
}

func shiftRandomPosition(meters: Double, randomMeters: Bool) -> CLLocationCoordinate2D {
let finalMeters: Double

if randomMeters {
finalMeters = Double.random(in: -meters..<meters)
} else {
finalMeters = meters
}

let randomAzimuth = Double.random(in: -Double.pi..<Double.pi)

return shift(byDistance: finalMeters, azimuth: randomAzimuth)
}
}

最佳答案

YMMV,但我能够通过将 displayPriority 显式设置为 .required 来解决此问题。文档这是默认值,但我在调试时注意到,注释实际上的优先级较低,这会导致它们被用户位置遮挡注释。

更新:这工作了一点,但随后它再次停止工作,每当 View 通过出队进行集群和/或重用时。我尝试在AnnotationView的init()、prepareForDisplay()等设置displayPriority,问题依旧。在所有情况下,对我有用 的是,每次创建或出队时都重置 displayPriority。如果您将 view.displayPriority = .required 添加到您设置 clusteringIdentifier 的代码上方或下方,在您返回 View 之前,它应该可以工作。为我工作!您可能还必须为 MKClusterAnnotationViews 积极/明确地重置它。

关于swift - 缩小时隐藏注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57630483/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com