5

MapView を持つ ViewController があり、コントローラーはストーリーボードで指定されたセグエによって初期化されます。MapView は、コントローラーのプロパティに (ストーリーボード経由で) 接続されています。


.h ファイル

@interface DetailViewController : UIViewController <MKMapViewDelegate>

@property (weak, nonatomic) IBOutlet MKMapView *locationMapView;

MapView を特定の領域の中央に配置する方法を使用しています。

- (void)centerMapView
{
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(CLLocationCoordinate2DMake(geoPoint.latitude, geoPoint.longitude), 1000, 1000);
    [self.locationMapView setRegion:region animated:NO];

    NSLog(@"size height: %f",self.locationMapView.frame.size.height);
    NSLog(@"size width: %f",self.locationMapView.frame.size.width);
}

viewDidLoad/からこのメソッドを呼び出すviewWillAppearと、最初は何も実行されませんが、ビューが読み込まれた 2 回目に正しく中央に配置されます。ログ出力は常に次のとおりです。

size height: 0.000000
size width: 0.000000

viewDidAppearMapView で呼び出されると、中央に配置され、出力サイズが正しくなります。

size height: 400.000000
size width: 320.000000

サイズの値は、ビューがまだ初期化されていないviewDidLoad/viewWill表示されていることを意味していると思います。これは、領域の設定に関する私の問題とは無関係かもしれません。

MapView の領域をviewDidLoad/に設定することが実際に不可能な場合viewWillAppearは、ユーザーが領域の変更を確認できないのではないかと思っています。

何かアドバイス?

4

1 に答える 1

0

ビュー サイズの問題は、リージョンの設定に関する問題とはおそらく無関係です。

重要な質問:DetailViewControllergeoPointプロパティが設定されるのはいつで、そのビューがロードされるタイミングと比較して? そのviewDidLoadプロパティを設定する前に (おそらくprepareForSegue:sender:別のビュー コントローラーからgeoPoint) を実行すると、マップを中央に配置しようとすると nil (ゼロ) になるため、正しく中央に配置されません。(そして、 のインスタンスがDetailViewController既に存在geoPointし、前回のインスタンスがあるため、2 回目は機能します。)

centerMapViewプロパティのカスタム セッターからメソッドを呼び出すことを検討することgeoPointもできます。これにより、View Controller が適切なデータを取得すると、それが発生することが保証されます。マップ遷移。

于 2012-12-24T19:54:16.593 に答える