私はSwift(iOSプログラミング全般)に不慣れで、地図上の2点に合うように地図をズームアウトする方法を見つけようとしています。
現在私は持っています
var zoomRect = MKMapRectNull;
var myLocationPointRect = MKMapRectMake(myLocation.longitude, myLocation.latitude, 0, 0)
var currentDestinationPointRect = MKMapRectMake(currentDestination.longitude, currentDestination.latitude, 0, 0)
zoomRect = myLocationPointRect;
zoomRect = MKMapRectUnion(zoomRect, currentDestinationPointRect);
これは何もしません。
どういうわけかマップにzoomRect
を適用する必要がありますか?
MKMapRectUnion
は、新しいrectを計算して返しますが、それ以上のものはありません。 mapViewに、表示領域をその新しい四角形に設定するように指示する必要があります。
myMapView.setVisibleMapRect(zoomRect, animated: true)
self.mapView.showAnnotations(self.mapView.annotations, animated: true)
以下のMKMapView拡張機能を使用してください-
extension MKMapView
{
func fitAllMarkers(shouldIncludeCurrentLocation: Bool) {
if !shouldIncludeCurrentLocation
{
showAnnotations(annotations, animated: true)
}
else
{
var zoomRect = MKMapRectNull
let point = MKMapPointForCoordinate(userLocation.coordinate)
let pointRect = MKMapRectMake(point.x, point.y, 0, 0)
zoomRect = MKMapRectUnion(zoomRect, pointRect)
for annotation in annotations {
let annotationPoint = MKMapPointForCoordinate(annotation.coordinate)
let pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0)
if (MKMapRectIsNull(zoomRect)) {
zoomRect = pointRect
} else {
zoomRect = MKMapRectUnion(zoomRect, pointRect)
}
}
setVisibleMapRect(zoomRect, edgePadding: UIEdgeInsetsMake(8, 8, 8, 8), animated: true)
}
}
}
For Swift 3、iOS 1
最初に現在の場所を取得し、コールバックdidUpdateLocationsを使用してマップを構成します。ビューコントローラに次のコードを追加します。
@IBOutlet weak var mapView: MKMapView!
private var locationManager: CLLocationManager!
override func viewDidLoad() {
super.viewDidLoad()
mapView.delegate = self
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
if CLLocationManager.locationServicesEnabled() {
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
}
}
public func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let last = newLocation {
let userlongitude = last.coordinate.longitude
let userlatitude = last.coordinate.latitude
let newDistance = CLLocation(latitude: userlatitude, longitude: userlongitude).distance(from: CLLocation(latitude: YourAnnotation.coordinate.latitude, longitude: YourAnnotation.coordinate.longitude))
let region = MKCoordinateRegionMakeWithDistance(last.coordinate, 2 * newDistance, 2 * newDistance)
let adjustRegion = self.mapView.regionThatFits(region)
self.mapView.setRegion(adjustRegion, animated:true)
}
}
-[MKMapView showAnnotations:animated:]
@lveselovskyが言ったように
self.mapView.showAnnotations(self.mapView.annotations, animated: true)
完璧に動作します。
マップがロードされる前にUIを更新する場合は、次のようにデリゲートメソッドに配置できます。
func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
guard !mapZoomUpdatedOnce else {
return
}
self.mapView.showAnnotations(self.mapView.annotations, animated: true)
self.mapZoomUpdatedOnce = true
}
ブール値は、最初に更新された後、ユーザーがマップ上の別の場所に移動しても再度更新されないことを確認するためだけのものです:)
Swift3すべての注釈をマップに合わせます。それは正しい方法です。
func zoomMapaFitAnnotations() {
var zoomRect = MKMapRectNull
for annotation in mapview.annotations {
let annotationPoint = MKMapPointForCoordinate(annotation.coordinate)
let pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0)
if (MKMapRectIsNull(zoomRect)) {
zoomRect = pointRect
} else {
zoomRect = MKMapRectUnion(zoomRect, pointRect)
}
}
self.mapview.setVisibleMapRect(zoomRect, edgePadding: UIEdgeInsetsMake(50, 50, 50, 50), animated: true)
}