既存アプリのiOS7対応
西 磨翁2013年10月7日
本日の事例となるアプリ
iOS7対応にも特集されました
ヤフオク!アプリ
IOS6
IOS7対応 途中
IOS7対応 最終形
作業は大きく分けて2つ
•iOS7向けに実装方法を変更する
•iOS7向けに装飾を行う
アイコンの準備・変更については今回は割愛します
ヤフオク!アプリについて
•iPhoneが日本に登場してまもなくリリースした歴史あるアプリ
•iOS4.3以降をサポート中
iOS7向けに実装方法を変更する
1.OS毎に処理を分岐する
このようなメソッドを用意しておいてOS毎の分岐処理に備えましょう
+ (BOOL)isOverThisVersion:(NSString *)version{! NSString!*currentVersion =![[UIDevice currentDevice]systemVersion];! return! (! [currentVersion! ! ! ! ! compare:! ! ! ! ! ! version! ! ! ! ! options:! ! ! ! ! ! NSNumericSearch! ! ! ! ]! !=!NSOrderedAscending! ! ! );}
2.UIViewControllerでの潜り込みに対処する
画面の上部が表示されない!?
iOS7では画面全体が表示領域となる
NavigationBarに潜りこんでしまう
NavigationBarに潜りこんでしまう
対処方法表示領域の拡張をやめさせる
self.edgesForExtendedLayout = UIRectEdgeNone;
※IOS7の時のみ実行するようにしましょうまた、すりガラスの表現が失われます
UIViewControllerにTableViewをaddSubviewした場合にも
発生します
画面の上部が潜り込む・・
同じようにself.edgesForExtendedLayout =
UIRectEdgeNone;※IOS7の時のみ実行するようにしましょうまた、すりガラスの表現が失われます
3.階層構造の変更に対応するその1
UITableViewCell
UITableViewCellContent
UIButtonなどのコンポーネント
UITableViewCell
UITableViewCellContent
UIButtonなどのコンポーネント
UITableViewCellScrollView
iOS6 iOS7
コンポーネントからsuperview.superviewでUITableViewCellにアクセスできなくなりました。
superview
superview
superview
superview
superview
対処方法
+ (UITableViewCell*)searchTableViewCell:(UIView*)view{ id target = [view superview]; if (!target) { return nil; } if ([target isKindOfClass:[UITableViewCell class]]) { return target; } return [self searchTableViewCell:target];}
UITableViewCellを探索して取得するようにする
superviewでUITableViewCellにアクセスしようとすること自体、Appleが推奨する方法ではありません。新規にアプリを作る場合は他の方法をご検討ください。
今後動かなくなる可能性があります。
ヤフオク!アプリは開発の歴史が長く、修正の影響範囲が大きかったため今回はこのような対応となりました。
ご注意!
4.階層構造の変更に対応するその2
UITableViewCellからsuperviewでUITableViewにアクセスできなくなりました
UITableView
UITableViewCell
UITableView
UITableViewCell
UITableViewWrapperView
iOS6 iOS7
superview
superview
superview
UITableView *tableView = nil; if (iOS7なら~) { //iOS7ではcell.superviewではUITableViewWrapperViewが返却される。 //このためUITableViewを取得するためにはcell.superview.superviewと //処理する必要がある tableView = (UITableView*)cell.superview.superview; }else{ tableView = (UITableView*)cell.superview; }
UITableViewCellの例と同じように探索してもよいし、単純な分岐でも大丈夫
superviewでUITableViewにアクセスしようとすること自体、Appleが推奨する方法ではありません。新規にアプリを作る場合は他の方法をご検討ください。
今後動かなくなる可能性があります。
ヤフオク!アプリは開発の歴史が長く、修正の影響範囲が大きかったため今回はこのような対応となりました。
くどいようですが・・・ご注意!
ヤフオク!アプリでは以上までの対応を行ってようやく動作するようになりました。
とりあえず動くレベル
もっとカッコよくしたい!
iOS7向けに装飾を行う
5.タブ上に罫線が表示される問題を解決する
UITabBarControllerにUIButtonをaddSubviewしていると発生する
対処方法
//ダミーのタブバー背景 [[UITabBar appearance] setBackgroundImage:[[UIImage alloc] init]]; //罫線除去 [[UITabBar appearance] setShadowImage:[[UIImage alloc] init]];
6.iOS6と同様の罫線表示にする
iOS7標準 罫線を引く
//セルの罫線のインデントをなくす [UITableViewCell appearance].separatorInset = UIEdgeInsetsZero;
7.「<」アイコンを変更する
iOS7標準 独自アイコン
//ナビゲーションバーの戻るのアイコンを変更[UINavigationBar appearance].backIndicatorImage = [UIImage imageNamed:@"header_allow_ios7.png"];[UINavigationBar appearance].backIndicatorTransitionMaskImage = [UIImage imageNamed:@"header_allow_ios7.png"];
iOS7より新たに追加されたメソッド
8.UITableViewStyleGroupedの強制大文字に対応する
iOS6 iOS7
UITableViewStylePlainに変更するまたは
tableView:viewForHeaderInSection:を実装する
他にも方法はありそうですが上記どちらかでOK
UITableViewStylePlainにしました
iOS7でも小文字が使える
9.accessoryはaccessoryViewに配置する
iOS7だと右づめになっていない
[cell.contentView addSubview:sw];↓
cell.accesoryView = sw;
その他のUIの色はtintColorをUIAppearanceで一括指定することで対応しました
まとめ• iOS6がリリースされた時と比べ対応工数が格段に多い。UI変更も含めると余裕を持った工数見積が必要。ヤフオク!アプリの場合、iOS6の対応を行った時よりも10倍程度の工数がかかった。
• UIAppearanceを活用して装飾に関する修正量を減らすようにする
APPENDIX
リリース後の反応について
色々なご意見を頂いていますが、IOS7対応後、
DL数はかなり増えました。一時的ではなく現在も継続してい
ます
IOS7対応の参考になれば幸いですご清聴ありがとうございました