我正在尝试构建一个应用程序,当您打开它时,它会缩放到您当前的位置。以下是我目前的代码。
class MapVC: UIViewController {
@IBOutlet weak var mapView: MKMapView!
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
mapView.zoomToUserLocation()
}
}
extension MKMapView {
func zoomToUserLocation() {
print(userLocation.location?.coordinate)
guard let coordinate = userLocation.location?.coordinate else { return }
let region = MKCoordinateRegionMakeWithDistance(coordinate, 10000, 10000)
setRegion(region, animated: true)
}
}
此代码无法解决问题。我相信这是因为应用程序在收到位置授权后没有时间来获取用户位置。我正在寻找一个等待应用程序拥有位置然后调用zoomToUserLocation函数的函数。我已经用do-while循环尝试了这个,但是没有用。我可以设置延迟,但这意味着缩放是在特定时间完成的,而我希望尽快完成缩放。我在目标C中找到了解决方案,但无法翻译它。
答案 0 :(得分:1)
此方法可能会有所帮助setUserTrackingMode(_:animated:)
,但我认为这不是您要找的。 p>
最适合您的解决方案是在CLLocationManager
代表上实施locationManager(_:didChangeAuthorization:)
和locationManager(_:didUpdateLocations:)
。然后,您在zoomToUserLocation()
中致电didUpdateLocations
。
另一个观察结果是,您不应该在viewDidLoad()
内对地图进行动画处理,因为它还没有在屏幕上显示视图。这应该在viewDidAppead()
。
答案 1 :(得分:0)
你需要一个跨度和一个区域......跨度允许你设置你想要放大多远...
let span = MKCoordinateSpan(latitudeDelta: 0.5, longitudeDelta: 0.5)
if let center = location?.coordinate {
let region = MKCoordinateRegion(center: center, span: span)
self.mapView.setRegion(region, animated: true)
self.mapView.showsUserLocation = true