234 Views
October 09, 13
スライド概要
2023年10月からSpeaker Deckに移行しました。最新情報はこちらをご覧ください。 https://speakerdeck.com/lycorptech_jp
既存アプリのiOS7対応 西 磨翁 2013年10月7日
本日の事例となるアプリ
iOS7対応にも特集されました
ヤフオク!アプリ
IOS6
IOS7対応 途中
IOS7対応 最終形
作業は大きく分けて2つ •iOS7向けに実装方法を変更する •iOS7向けに装飾を行う アイコンの準備・変更については今回は割愛します
ヤフオク!アプリについて •iPhoneが日本に登場してまもな くリリースした歴史あるアプリ •iOS4.3以降をサポート中
iOS7向けに実装方法を 変更する
1.OS毎に処理を分岐する
+ ! ! ! ! ! ! ! ! } (BOOL)isOverThisVersion:(NSString *)version{ NSString! *currentVersion =![[UIDevice currentDevice]systemVersion]; return! (! [currentVersion ! ! ! ! compare: ! ! ! ! ! version ! ! ! ! options: ! ! ! ! ! NSNumericSearch ! ! ! ]! !=!NSOrderedAscending ! ! ); このようなメソッドを用意しておいて OS毎の分岐処理に備えましょう
2.UIViewController での潜り込みに対処する
画面の上部が表示されない!?
iOS7では画面全体が表示領域となる
NavigationBarに潜りこんでしまう
NavigationBarに潜りこんでしまう
対処方法 表示領域の拡張をやめさせる
self.edgesForExtendedLayout = UIRectEdgeNone; ※IOS7の時のみ実行するようにしましょう また、すりガラスの表現が失われます
UIViewControllerにTableView をaddSubviewした場合にも 発生します
画面の上部が潜り込む・・
同じように self.edgesForExtendedLayout = UIRectEdgeNone; ※IOS7の時のみ実行するようにしましょう また、すりガラスの表現が失われます
3.階層構造の変更に対応する その1
iOS6 iOS7 UITableViewCell UITableViewCell superview superview UITableViewCellScrollView superview UITableViewCellContent UITableViewCellContent UIButtonなどの コンポーネント superview UIButtonなどの superview コンポーネント コンポーネントからsuperview.superviewで UITableViewCellにアクセスできなくなりました。
対処方法
+ (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
iOS6 iOS7 UITableView UITableView superview superview UITableViewWrapperView superview UITableViewCell UITableViewCell UITableViewCellからsuperviewで UITableViewにアクセスできなくなりました
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 [UIImage [UINavigationBar [UIImage appearance].backIndicatorImage = imageNamed:@"header_allow_ios7.png"]; appearance].backIndicatorTransitionMaskImage = imageNamed:@"header_allow_ios7.png"]; iOS7より新たに追加されたメソッド
8.UITableViewStyleGrouped の強制大文字に対応する
iOS6 iOS7
UITableViewStylePlainに変更する または tableView:viewForHeaderInSection: を実装する 他にも方法はありそうですが 上記どちらかでOK
iOS7でも小文字が使える UITableViewStylePlainにしました
9.accessoryはaccessoryViewに 配置する
iOS7だと右づめになっていない
[cell.contentView addSubview:sw]; ↓ cell.accesoryView = sw;
その他のUIの色はtintColorを UIAppearanceで一括指定する ことで対応しました
まとめ • iOS6がリリースされた時と比べ対応工数が格段に多 い。UI変更も含めると余裕を持った工数見積が必要。 ヤフオク!アプリの場合、iOS6の対応を行った時よりも 10倍程度の工数がかかった。 • UIAppearanceを活用して装飾に関する修正量を減らすよ うにする
APPENDIX
リリース後の反応について
色々なご意見を頂いていますが、 IOS7対応後、 DL数はかなり増えました。 一時的ではなく現在も継続してい ます
IOS7対応の参考になれば幸いです ご清聴ありがとうございました