Hatena::ブログ(Diary)

Kazzzの日記 このページをアンテナに追加 RSSフィード

2013-09-23

[][]iOS7ステータスバーが被る問題への対応

先日のエントリでも書いたが、iOS6→iOS7への移行で最も酷いなと感じたのはステータスバーの問題である

ステータスバーのレイヤの違いと画面に与える影響

f:id:Kazzz:20130922211218p:image:w300
iOS7においてはステータスバーはコンテンツとは完全に独立したレイヤとして扱うことになったようで、基本的に透過レイヤであり座標系もビューのルートと共有していない。つまりはiOS6までのアプリケーションをiOS7上で動かすとこのようにステータスバーがビューに覆い被さるように描画されてしまう。

この問題はステータスバーを表示している、つまりフルスクリーンを使う画面以外全ての画面が影響を受けてしまう凶悪なものだ。

ステータスバーをiOS6同様に非透過レイヤとすることで回避できそうなものだが、iO7ではステータスバーを非透過にする事は(今のところ)方法は無いので、これに合わせるしかない。ということは...iOS6まででステータスバーを透過にデザインしていないアプリケーションはこのままでは全てデザインし直しである。

例外としてナビゲーションバーを表示することでiOS7でもビューを期待する位置に描画することもできるが、この場合ナビゲーションバーを非透過にする必要がある。
f:id:Kazzz:20130922211220p:image:w300
なので、iOS7でデフォルトである透過コントロールを使う場合はやはり調整が必要だ。

幸いなことにステータスバーの高さはアプリケーション内で取得出来る。なので、画面を表示する際にiOS7であればビューのY座標をその分ずらしてやれば良いことになる。

サンプルコードの前提として、ずらしたい他のコンテンツが乗ったビューのルートをInterfaceBuilderによってcontentViewという名のプロパティにアウトレットしておく必要がある。

iOS6とiOS7で同一デザインの画面を使うためのコード
- (void)viewDidLoad
{
    [super viewDidLoad];

    if ([[[[UIDevice currentDevice] systemVersion]
         componentsSeparatedByString:@"."][0] intValue] >= 7) //iOS7 later
    {
        CGRect statusBarViewRect = [[UIApplication sharedApplication] statusBarFrame];
        float heightPadding = statusBarViewRect.size.height + self.navigationController.navigationBar.frame.size.height;
        
        CGRect original = self.contentView.frame;
        
        CGRect new = CGRectMake(original.origin.x,  original.origin.y + heightPadding,
                                original.size.width,  original.size.height - heightPadding);
        
        self.contentView.frame = new;
    }
}

なにをしているかはコードを見れば一目瞭然だろう。既に書いたがステータスバーの下にはナビゲーションバーがあることも考慮にいれている。(それにしてもUIKitでビューのサイズを変更するのはいちいちCGRect変数を入れ替えねばならず面倒だ)

実行結果
iOS6iOS7
f:id:Kazzz:20130922214127p:image:w300f:id:Kazzz:20130922211219p:image:w300

このようにコードに手を入れる必要があるが、ナビゲーションバーを透過にした状態であってもiOS6、iOS7で共通のデザインで表示することができる。

にしても、これはSDK後方互換性としては最低の部類の対応な訳で、上記のようなアドホックなコードも醜いことこの上ない。
AppleはこうまでしてiOS6以前のデザインを排除したかったのだろうか。もとい、AppleはiOS6以前のデザインをよほど使ってほしくないのだろうな。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

リンク元