2013年9月23日月曜日

iOS7 対応アプリにする(マイクとUI)

iOS7が解禁です。 UIが大幅にアップデートするなど, いろいろあるみたいですが, そのおかげで以前に作っていたアプリに 変更を入れないといけないことが判明。SDKの変更をしたら色々出てきたそのレポートです。 変更が必要になってしまった部分
  • マイクの使用にパーミッションが必要になったこと
SDKのアップデータの為に変更を余儀なくされた部分。
  • storyboard がiOS6, iOS7用のviewに分かれ, iOS7用のviewで不具合が

内容

  • マイクのパーミッション
  • バージョンの取得と動作
  • Navigationbarの処理

マイクのパーミッション

GPSのデータを使用する際やプッシュ通信の許可と同様に, ダイアログが出てきます(iOS7)。 その許可なくマイクロを使用すると, Applicationが落ちるそうです。 以下のコードを追加します。
if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission:)])
{
        [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL allowed){
            NSLog(@"Allow microphone use? %d", allowed);
            if ( !allowed ) {
                 // If not enabled microphone, here is
            }
        }];
}
iOS6ではこのコードは無視されます当然iOS7 SDKでコンパイルしないといけません。requestRecordPermission というメソッドが存在しないからです。 一度許可すると, allowed の部分が常に, trueになります。ダイアログは出ません。 ですので, マイクを使用する部分にこのコードを入れておくとよいでしょう。 ブロックコードでないバージョンもあります。

バージョンの取得と動作

いろいろ7のおかげで動かなくなったUIのために, バージョン別コードを挿入する必要があったので作っておく
+(BOOL)isOver7 {
    const float version = [[[UIDevice currentDevice] systemVersion] floatValue];
    return version >= 7.0;
}
iOS7の場合, trueが返ります。 UIDevice の systemVersionを使います。


Navigationbarの処理

ここからはUIの管理です。 UIに関しては, Guideが詳しい。いろいろ対処法を伝授してくれるはず。 端的に問題をいいますと, Navigationbar が透明になって, 座標の位置が変わった。 今まで viewがbar の下から始まっていましたが透明になって, barの位置からになりました。ので, UIがずれます。

不透明にしてiOS6と同じ座標位置にする

これは簡単な対処です。
self.navigationController.navigationBar.translucent = NO;
UINavigationBar の translucent を使います。これで不透明になります。

地道にデルタを使ってUIの位置を直す

※AutoLayoutのプロパティをチェックしてればこの設定はありません。そして必要ありません。(デルタの部分は出てきません) iOS6の位置と, iOS7の位置をInterfaceBuider のデルタを使って変更することができます。つまり, 透明になった部分だけずらすということです。 さて, storyboardがどう変わったのか見てみましょう。



storyboardのviewという欄でiOS6, iOS7のViewが登場します。選択すると, 見た目の違いがここで確認できます。

UITabbar

Navigationbarと同じでありまた, カスタムで画像や色を変更している場合は, 結構引っ掛かります。 tabbaritem の画像を変更している場合 setFinishedSelectedImage を使いますが, なぜかいうことを聞きません。 selectedImage というプロパティを直接操作します。
item.selectedImage = [UIImage imageNamed:@"filename"];
同様に, 不透明にできます。(ただしiOS7しか使えないので, 6では実行されないように処理する必要があります)
 self.tabBarController.tabBar.translucent = NO;
※UIに関しては, AutoLayout機能でなんとかしてくれたりします。ですので一概に問題が発生するとは言い難いです。 AutoLayoutはiOS6以降ですけども。

0 件のコメント:

コメントを投稿