2016-12-13 17 views
1

私はあなたが現在の場所にズームするときに開くアプリケーションを構築しようとしています。以下は私のコードです。SWIFT:起動時に現在の場所にズームする方法を教えてください。

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) 
}  
} 

このコードでは問題は解決しません。これは、ユーザーの所在地を取得するために場所の認可を受けてから時間がないためです。私は、アプリケーションがlocationを持っているのを待ってからzoomToUserLocation関数を呼び出す関数を書くことを考えています。私はすでにdo-whileループでこれを試しましたが、うまくいきませんでした。私は遅れを設定することができますが、それは特定の時間にズームが行われ、その代わりにズームができるだけ早く行われることを意味します。私は目的Cでこれに対する解決策を見つけましたが、それを翻訳することはできませんでした。

答えて

1

この方法は役に立ちますsetUserTrackingMode(_:animated:)、しかし私はあなたが探しているものではないと思います。

あなたに最適な解決策は、CLLocationManagerの代理人にlocationManager(_:didChangeAuthorization:)locationManager(_:didUpdateLocations:)を実装することです。その後zoomToUserLocation()didUpdateLocationsに呼び出します。

別の観察は、あなたがviewDidLoad()内部のマップをアニメーションべきではないということです「まだ画面上に表示していない原因となります。これはviewDidAppead()で行う必要があります。

+0

ねえ、私はそれを呼んでいるdidChangeAuthorizationとdidUpdateLocationsの両方でと両方とも、開始時にwriteと呼ばれるのは、現在のユーザー位置に対してnilの値を持っています。 –

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 
関連する問題