iOS8のリリースが間近ですが、Xcode6への対応はお済みですか?
Xcode6にしたらビルドエラーを吐かれたり、改修後の十分な試験が行えないために、
Xcode5によるビルドでiOS8が問題なく動くようにしてiOS8リリースを迎える方もいらっしゃると思います。
iOS8で発生したデグレと、Xcode5による対応方法についてまとめました。
#ダイアログ表示のレイアウト崩れ
UIAlertViewのtitleをnilしている場合に、messageがダイアログに対して枠の上部ギリギリに表示されてしまい、かつ文字が太字で表示されてしまいます。
UIAlertViewの初期化時に
[[UIAlertView alloc] initWithTitle:nil message:@"さんぷる" delegate:...
のようにされている場合に発生します。
(iOS8からUIAlertViewがdeprecatedになり、
UIAlertControllerへの移行を推奨されていることは分かっていますが、)
Xcode5で対応する場合は以下がオススメです。
[[UIAlertView alloc] initWithTitle:@"" message:@"さんぷる" delegate:...
title箇所をnilから@""の空文字指定にすることです。
messageが短いと表示位置の崩れが少し残ってしまいますが、太字表示は解消されます。
iOS7以下への表示の変更もありません。
#アクションシートがiPadで表示されない
UIActionSheetがiPadで表示されない場合があります。
[actionsheet showInView:self.view];
のようにshowInViewにself.viewを指定するとiPad(iOS8)では表示されません。
[actionsheet showInView:self.button.view];
のように画面内のボタンなどのviewを指定してやると表示されるようになりました。
###※ iOS8 GMで本件は解消されました。
iOS8 beta5では発生していましたが、改修されたようです。
beta版って怖いですね。
※ただし、UIActionSheetにaddSubViewで様々なカスタマイズをされている場合には未だアクションシートが表示されなかったり、アプリが落ちたりするかもしれません。
#カメラのプライバシー設定
iOS8から「設定」「プライバシー」の項目に新たにカメラが追加されています。
カメラ機能を使用している場合は、以下のメソッドを使ってカメラ機能の許可状態を確認してください。
+ (AVAuthorizationStatus)authorizationStatusForMediaType:(NSString *)mediaType
このメソッド自体はiOS7から使用可能です。
iOS7ではmediaTypeにAVMediaTypeVideoを指定した場合、
常にAVAuthorizationStatusAuthorizedを返していましたが、
iOS8からカメラのプライバシー設定の判定用メソッドとして機能するようになったようです。
使用例:
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
switch (status) {
case AVAuthorizationStatusRestricted:
case AVAuthorizationStatusDenied: // プライバシー設定でカメラが制限されている場合
// 設定画面でプライバシー設定の変更をお願いする
return;
case AVAuthorizationStatusNotDetermined: // 初めてこのアプリでカメラ機能を使用する場合
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted){
if (granted) {
// 許可された場合の処理
} else {
return;
}
}];
break;
case AVAuthorizationStatusAuthorized: // プライバシー設定でカメラの使用が許可されている場合
default:
break;
}