質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Q&A

解決済

1回答

2797閲覧

MKMapVIewの指定座標を中心にカメラを回す方法。

cicle

総合スコア35

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

0グッド

0クリップ

投稿2016/09/30 01:29

3D地図を表示するにあたって目的地をMKMapViewの中心にアノテーションを置き
その目的地をMap中心に捉えながら、目的地を中心とした半径200mの円周上にM移動し続ける。
といった実装をしたいのですが上手く行きません。

ObjectiveC

1// 東京スカイツリーの座標 2 m_targetLocation = CLLocationCoordinate2DMake(35.710033, 139.8187); 3 m_cameraLocation = CLLocationCoordinate2DMake(35.710043, 139.8087); 4 cr.center = m_targetLocation; 5 6 // 縮尺 0.01 7 cr.span = MKCoordinateSpanMake(0.01, 0.01); 8 [_mapView setRegion:cr animated:YES]; 9 10 _mapView.mapType = MKMapTypeHybridFlyover; 11 [self addAnnotationToCoordinate:m_targetLocation title:@"東京スカイツリー" subTitle:@"住所:住所が入ります。"]; 12 13 MKMapCamera *camera = [MKMapCamera cameraLookingAtCenterCoordinate:m_targetLocation 14 fromEyeCoordinate:m_cameraLocation 15 eyeAltitude:200.0]; 16 17 [self.mapView setCamera:camera]; 18 [self.mapView setShowsBuildings:YES]; 19

以下は試したものを記載しています。

  • "m_cameraLocation"のfromEyeCoordinateを更新して

[_mapview setCamera:]すれば出来るかな?と思ったのですが出来ませんでした。

Objectivec

1- (void)startAnimation 2[UIView animateWithDuration:1.0 3 animations:^{ 4 5 float theta = 5.0; 6 float lat = cosf(theta)*(m_cameraLocation.latitude + 0.00001); 7 float lon = sinf(theta)*(m_cameraLocation.longitude + 0.00001); 8 m_cameraLocation = CLLocationCoordinate2DMake(lat, lon); 9 10 CLLocationDistance eyeAltitude = 200.0; 11 12 MKMapCamera *camera = [MKMapCamera cameraLookingAtCenterCoordinate:m_targetLocation 13 fromEyeCoordinate:m_cameraLocation 14 eyeAltitude:eyeAltitude]; 15 [UIView beginAnimations:nil context:nil]; 16 [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 17 [UIView setAnimationDuration:2.5]; 18 self.mapView.camera = camera; 19 [UIView commitAnimations]; 20 21 } completion:^(BOOL finished) { 22 [self startAnimation]; 23 }]; 24

  • Mapの右上に表示されている方位磁石?をタップすると座標位置を捉えながら北へ向くのを見てhedingを変更すれば簡単なのかな?と思ったのですがこちらも上手く行きませんでした。

objectivec

1- (void)startAnimation { 2 MKMapCamera *nextCamera = [MKMapCamera cameraLookingAtCenterCoordinate:m_targetLocation 3 fromDistance:200 4 pitch:_mapView.camera.pitch 5 heading:_mapView.camera.heading - 5]; 6 [_mapView setCamera:nextCamera]; 7 [self startAnimation]; 8}

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

考え方は間違っていないのですが、最初の方は、UIViewのanimateWithDurationではアニメーション出来ません。(UIViewのプロパティをアニメーションさせるためのものです)

二番目の方は、ひっきりなしにカメラ更新の処理が動いているためViewが更新されていなんだと思います。

ということで、NSTimerを使ってheadingを更新させてみました。(カメラを作り直すのではなくプロパティをいじってます)

objectivec

1[NSTimer scheduledTimerWithTimeInterval:0.2 //間隔 2 target:self 3 selector:@selector(moveCamera:) 4 userInfo:nil 5 repeats:YES];

こんな感じでタイマーを動かして、

objectivec

1- (void)moveCamera:(NSTimer *)timer 2{ 3 //色々面倒なのでintで処理する 4 int heading = self.mapView.camera.heading; 5 heading = (heading + 10) % 360; //10度ずつ、0 <= heading < 360 6 self.mapView.camera.heading = heading; 7 //NSLog(@"heading=%7.3f %zd", self.mapView.camera.heading, heading); 8} 9

とりあえず動きはしたのですが、heading=0(真北)付近での挙動がおかしいです。

animateWithDurationでアニメーション

objectivec

1{ 2 MKMapCamera *camera; 3} 4 5//カメラ初期化 6camera = [MKMapCamera cameraLookingAtCenterCoordinate:m_targetLocation 7 fromEyeCoordinate:m_cameraLocation 8 eyeAltitude:1000.0]; 9camera.heading = 0; 10[self.mapView setCamera:camera]; 11 12[UIView animateWithDuration:5.0 13 delay:0.0 14 options:UIViewAnimationOptionCurveLinear 15 animations:^{ 16 //直接変更するのではなく、変更したカメラをセットするのがポイント 17 camera.heading = 180; //目標値 18 self.mapView.camera = camera; 19 } completion:^(BOOL finished) { 20 NSLog(@"completed"); 21 }];

投稿2016/09/30 06:13

編集2016/10/03 00:29
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cicle

2016/09/30 09:56

fuzzballさん。 ご回答いただきありがとうございます! 早速ためしましたら初めてカメラが動きました。 しかし、iPadが古いのか動きがカクカクしたので 参考にさせて頂き、moveCamera:の内容をいかに置き換えてみました ```Objectivec MKMapCamera *moveCamera = [_mapView.camera copy]; int heading = self.mapView.camera.heading; heading = (heading + 4) % 360; moveCamera.heading = heading; [_mapView setCamera:moveCamera animated:YES]; ``` 私自身もプロパティの数値をいじって動かすほうがスマートだと思うので、 そのようにしたいのですが。。。 また、iPadのCPU稼働率?がカメラが動いていると150%以上のなっていて、実用的ではなさそうなんです。。。
fuzzball

2016/09/30 10:33 編集

setCameraだとアニメーション出来るんですね。durationがあれば良かったのですが‥。うちのiPhone5(+iOS8)だとmaxで60%くらいです。 これ以上はお力になれそうにありません。
fuzzball

2016/10/03 00:32

質問のコードを眺めていて、アニメーションの書き方が変なことに気付きまして(もっと早く気付けよという話ですが)、色々と試していたらカメラのアニメーションに成功しました。(回答に追記) ただし、やはり0度付近でおかしくなるのと、+180度以上(?)のアニメーションでおかしくなるので、360度キレイに回すには工夫が必要そうです。
cicle

2016/10/03 04:50

fuzzballさん 追記・編集ありがとうございます! >質問のコードを眺めていて、アニメーションの書き方が変なことに気付きまして(もっと早く気付けよという話ですが) いえ、僕自身がキチンと調べないとダメなんです...気付いて頂きありがとうござます! 追記していただいた内容で求めていた動きになりました! >ただし、やはり0度付近でおかしくなるのと、+180度以上(?)のアニメーションでおかしくなるので、360度キレイに回すには工夫が必要そうです。 こちらは { int m_currentCameraHeading; } (void)moveCamera{ MKMapCamera *moveCamera = [_mapView.camera copy]; if (m_currentCameraHeading == 0) { moveCamera.heading = 120.0; } else if (m_currentCameraHeading == 120) { moveCamera.heading = 240.0; } else if (m_currentCameraHeading == 240) { moveCamera.heading = 360.0; } else if (m_currentCameraHeading == 360) { moveCamera.heading = 120; } m_currentCameraHeading = moveCamera.heading; [UIView animateWithDuration:5.0 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{ self.mapView.camera = moveCamera; } completion:^(BOOL finished) { [self moveCamera]; }]; } 少しブサイクですが、このようにしたら綺麗に回り続けました。 お力を頂きまして有難うございます。 今後ともよろしくお願いします!
fuzzball

2016/10/03 05:55

カメラを作り直したりしないといけないかなぁ、などと難しく考えていましたが、分割するだけで良かったんですね。でも0度付近でおかしい(コンパスがチラつく)のはどうしようもなさそう‥。 で、ブサイクはこれで解消できるかと。 m_currentCameraHeading = (m_currentCameraHeading + 120) % 360; moveCamera.heading = m_currentCameraHeading;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問