MKMapView と MKMapCamera を使用しているときに、奇妙な動作に気付きました。Apple Maps アプリの標準動作の一部を実装する必要があります。基本的に、マップ ビューのユーザー トラッキング モードがMKUserTrackingModeFollowWithHeadingに設定されているときに、2D モードと 3D モードを切り替えることができるようにする必要があります。
現在、userTrackingMode が MKUserTrackingModeNone に設定されている場合、私のソリューションは正常に動作しますが、他のモードでは奇妙なアニメーションが実行されます (設定したカメラ: アニメーション:YES または NO に関係なく発生します)。カメラのパラメーターを新しく設定する直前と直後に記録すると、唯一の違いはピッチの変更です。
別の問題は、カメラの高度を変更して、プログラムでズームインまたはズームアウトすることです。IBAction メソッドでピンチインまたはピンチアウトのジェスチャーでズームを模倣しようとしています。followWithHeadingMode では、マップは常に「デフォルト」のズーム レベル (カメラの高度) に戻りますが、他のモードではうまく機能します。
何が起こっているのかを確認するためにサンプルプロジェクトを開始しました。これは、問題が発生したマップビューを備えた単一ビューアプリケーションのビューコントローラーです:
#import "CCViewController.h"
@interface CCViewController ()
@end
@implementation CCViewController
- (void)viewDidLoad{
[super viewDidLoad];
}
- (void)setUpMap{
[self.mapView setShowsUserLocation: YES];
}
- (void)viewDidAppear:(BOOL)animated{
[self setUpMap];
}
- (IBAction)mapModeSwitchClicked:(id)sender {
MKMapCamera *newCamera = [MKMapCamera camera];
newCamera.centerCoordinate = self.mapView.camera.centerCoordinate;
newCamera.heading = self.mapView.camera.heading;
newCamera.altitude = self.mapView.camera.altitude;
if(!self.mapView.camera.pitch){
newCamera.pitch = 50;
self.mapModeSwitch.title = @"2D";
}
else{
newCamera.pitch = 0;
self.mapModeSwitch.title = @"3D";
}
[self.mapView setCamera:newCamera animated:YES];
}
- (IBAction)locateMeButtonClicked:(id)sender {
if(self.mapView.userTrackingMode != MKUserTrackingModeFollowWithHeading)
[self.mapView setUserTrackingMode:MKUserTrackingModeFollowWithHeading animated:YES];
else
[self.mapView setUserTrackingMode:MKUserTrackingModeNone animated:YES];
}
- (void)zoomMapWithZoomFactor:(double)factor{
MKMapCamera *newCamera = [MKMapCamera camera];
newCamera.pitch = self.mapView.camera.pitch;
newCamera.heading = self.mapView.camera.heading;
newCamera.altitude = self.mapView.camera.altitude * factor;
newCamera.centerCoordinate = self.mapView.camera.centerCoordinate;
[self.mapView setCamera:newCamera animated:YES];
}
- (IBAction)zoomInClicked:(id)sender {
[self zoomMapWithZoomFactor: 0.5];
}
- (IBAction)zoomOutClicked:(id)sender {
[self zoomMapWithZoomFactor: 2];
}
@end
私が探しているのは、Apple Maps アプリに似た動作です。あなたはなにか考えはありますか?私は何を間違っていますか?