2015年10月26日

【Xcode】各iPhone毎の解像度やUINavigationBarの問題など(iOS9〜)

アプリ開発が非常にご無沙汰で
昨日、個人で所有しているMacMiniさんをYosemiteからEl Capitanにアップデートしました


Storyboardを使ってアプリ開発の仕事をさせていただいておりますが、
いくつかメモ程度にカキコ


■各端末毎の解像度
端末名解像度アイコンサイズ
iPhone3G,3GS320x48060x60
iPhone4,4S640x960120x120
iPhone5,5s640x1136120x120
iPhone6,6s750x1334120x120
iPhone6Plus,6sPlus1242x2208180x180

こうやってみると
複雑化しましたねぇ
iOS8からは起動時のスプラッシュはxibを使った手法がおすすめされており、
フルスクリーンサイズの画像を準備する必要は薄くなったのですが
iOS7では対応できないので、iOS7まで動くアプリを作るときは必要になってしまいます。

上記解像度分必要になりますが、ファイル名に関してはXCodeのガイドを使って設定すれば
自動的に命名してくれるのであまり気にしないでいいかもしれません

■NavigationBarのサイズ
端末名Portrait時Landscape時
iPhone3G,3GS320x44480x32
iPhone4,4S640x88960x64
iPhone5,5s640x881136x64
iPhone6,6s750x881334x64
iPhone6Plus,6sPlus1242x1322208x132

UINavigationBar appearanceにてバックグラウンドのイメージを入れ替える処理をしているとき
なんかLandscape時のiPhone6Plusだけ計算が合わなかったんですよね

NavigationBarを取得して高さを調べたら44で返ってきたんですよ
となるとスケールは3倍なので高さ132の画像を用意したらぴったり表示されました
@3xだけ注意が必要でした…

■iPhone6Plus,6sPlusだけのバグ?
UINavigationBarの背景画像を設定する口で

    NSString* menuBarPortraitImageName = @"MenuBar.png";
    UIImage* portrait = [UIImage imageNamed: menuBarPortraitImageName];
    [[UINavigationBar appearance] setBackgroundImage: portrait forBarMetrics: UIBarMetricsDefault];
    NSString* menuBarLandscapeImageName = @"MenuBarLandscape.png";
    UIImage* landscape = [UIImage imageNamed: menuBarLandscapeImageName];
    [[UINavigationBar appearance] setBackgroundImage: landscape forBarMetrics: UIBarMetricsLandscapePhone];

というappearance処理をAppDelegate時に設定していました
iPhone4s,5s,6で確認した限り、
設定した画像がちゃんと表示されていましたが、iPhone6Plusでみたときだけ、ただしく表示されませんでした

状況としてはアプリがPortrait固定の画面から、present表示で横画面になったときのNavigationBarの背景画像が
横ぴったりの画像が選ばれておらず、menuBarPortraitImageNameで指定した画像が表示されていました。

おそらくですが、iPhone6Plusだけ縦でも横でもナビゲーションバーの高さが44となっているため、
UIBarMetricsLandscapePhoneが有功にならないんじゃないかなと

というわけで対策として
UINavigationControllerのサブクラスを用意しているので(ViewControllerの回転のために)

- (UIInterfaceOrientationMask)supportedInterfaceOrientations{
    if(self.topViewController.supportedInterfaceOrientations == UIInterfaceOrientationMaskPortrait){
        [[UINavigationBar appearance] setBackgroundImage: [UIImage imageNamed: @"MenuBar.png"] forBarMetrics: UIBarMetricsDefault];
    }
    else{
        [[UINavigationBar appearance] setBackgroundImage: [UIImage imageNamed: @"MenuBarLandscape.png"] forBarMetrics: UIBarMetricsDefault];
    }
    return self.topViewController.supportedInterfaceOrientations;
}

回転時にコールされるメソッドにて
TopViewControllerの向きから都度画像を設定するように変更しました
ポイントとして「UIBarMetricsDefault」をどちらも指定しているところですねぇ

----------2015/10/27追記
上記の方法で切替を行うと
iOS7では正しく動かないことが確認されました

Portrait固定からpresent表示でLandscapeにチェンジするケースにおいて
iOS7ではこのメソッドがコールされるタイミングが異なるようで
dismisでPortraitに戻ってきた時にLandscapeの画像が設定されることになってしまいました
→UIBarMetricsDefaultにしているから

結局NavigationControllerのRootViewControllerに設定しているViewControllerのviewDidLoadのタイミングで指定するようにしました…残念

----------


何か気づいたことがあれば追記します。
posted by ヒイロ at 13:53| 福岡 ☀| Comment(0) | TrackBack(0) | プログラム | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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


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

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