2013年02月19日

【iPhone SDK】iOS6のMapを回転させる。そして「著作権情報」の位置を変更する

1月からiOS Devのライセンスを購入しているので、アプリを作っています。

今回実装しようとしているのは、
テーマパークのパンフレットに載っているアトラクションマップにあわせ、
標準の地図を回転させてみるっというものです。
標準の地図はMapKitフレームワークをインポートして、
MKMapViewを画面に追加します。

- (void)viewDidLoad{
    self.mapView = [[[MKMapView alloc] initWithFrame: [UIScreen mainScreen].bounds] autorelease];
    [self.view addSubview: self.mapView];
    [self.mapView setDelegate: self];
    [self.mapView setUserTrackingMode: MKUserTrackingModeNone animated: NO];
    [self.mapView setShowsUserLocation: YES];
    MKUserLocation* userLocation = self.mapView.userLocation;
    [userLocation setTitle: @"現在位置"];
    [userLocation setSubtitle: @""];
    [self.mapView setZoomEnabled: YES];
    [self.mapView setScrollEnabled: YES];
}
ViewController全体にマップを表示するなら上記のように実装すると簡単に地図が表示され、
[self.mapView setShowsUserLocation: YES];
によって、GPSから現在位置を取得し、青い●のポインタが地図上の現在位置に表示されます。

このままでは地図は北向きをむいています。

テーマパークのパンフレットの地図にあわせて方角を変更しましょう

とそのまえにデグリーをラジアンに変換する処理が必要になりますので
計算式をおさらいしておきましょう

数学の授業で習っているはずですので式をかけば
radian = (degree / 180.0f) * 3.14;
ですね。

上記計算結果を返すメソッドをcalcRadianFromDegreeとして

CGFloat radian = [self calcRadianFromDegree: 45];
CGAffineTransform trans = CGAffineTransformMakeRotation(radian);
[self.mapView setTransform: trans];
これでViewがぐるりと回転をします。

さて、ここで地図を確認すると
左下に表示されていた「著作権情報」というボタンのような押下可能なラベルが見当たらないかと思います。

iOS5まではGoogleMapというロゴが表示されていました。

ネットで検索すると
GoogleMapのロゴはImageViewらしいので

UIView* mapLogoView = nil;
    for(UIView* subView in self.mapView.subviews){
    // Googleロゴ
    if([NSStringFromClass([subView class]) isEqualToString: @"UIImageView"]){
        mapLogoView = subView;
        break;
    }
}
とすれば取得でき、そのmapLogoViewに対してself.viewにaddSubViewしてあげれば、
どんなに地図を回転させようと固定の位置に表示ができますね。

しかし、iOS6以降の「著作権情報」はイメージでないようです。
上記のループ内でUIViewのdescriptionをログ表示してみたところ

MKAttributionLabel

というクラス名がみつかりました。
こいつ特別なラベルみたいです。

そこでiOS6の場合は以下のようにしましょう

UIView* mapLogoView = nil;
    for(UIView* subView in self.mapView.subviews){
    // 著作権表示
    if([NSStringFromClass([subView class]) isEqualToString: @"MKAttributionLabel"]){
        mapLogoView = subView;
        break;
    }
}
取得できたmapLogoViewに対し以下のようにチェックしてから実装します。

if(mapLogoView){
    [mapLogoView removeFromSuperview];
    [self.view insertSubview: mapLogoView aboveSubview: self.mapView];
}
確実のマップの上になるよう、マップビューの上にインサートするようにしました。
そのまえにマップから切り離し処理も念のためしてみました。

iOS5から対応アプリを作成し、地図の回転をするっという場合は、
iOSのバージョンチェックをして上記の両方を対応しておかないと
アップルの審査にてリジェクト対象になってしまいます。(GoogleMap時代のガイドラインにはしっかりと明記あり)
iOS6現在のガイドラインには地図に関する明記はないけれど、懸念は少しでも減らしておきたいですよね




【送料無料】バカ世界地図 [ 一刀 ]

【送料無料】バカ世界地図 [ 一刀 ]
価格:1,134円(税込、送料込)

ラベル:Xcode
posted by ヒイロ at 11:47| 福岡 ☔| Comment(0) | TrackBack(0) | プログラム | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック