[iOS7] UITableView の境界線を separatorInset= UIEdgeInsetsZero で変えた時の副作用

2013年12月9日月曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

iOS7になってから UITableView の区切り線の左が短く切れた表示がデフォルトとなった。

iOS6までのように左まで線を引くにはいくつか方法があって一番簡単なのは appearanceを使う方法。ネットでたくさん出てた。
[UITableViewCell appearance].separatorInset = UIEdgeInsetsZero;
するとこうなる。アプリで使うすべての UITableViewが対象になるのでこれは便利。


ところがこれを使った場合メール送信のモーダルビュー表示で問題が出た。ツールバー上のボタン押下で MFMailComposeViewControllerを表示していたところ、iOS7だとメール編集画面が一瞬表示されてしまった後にすぐに閉じてしまうという現象が出た。

↑一瞬出てすぐ消える。
コンソールには次のエラーが出てた。
_serviceViewControllerReady:error: Error Domain=NSCocoaErrorDomain Code=4097
 "The operation couldn’t be completed. (Cocoa error 4097.)"
なんかおかしい。同じプログラムでも iOS6で動かすとこの現象は出ない。

調べてみると UIBarButtonItem などのアピアランスをカスタマイズしているとこの現象が出るらしい。

Cannot show modal ViewController in iOS7

MFMailComposer Dismissing immediately after launch


ただ自分のところでは UIBarButtonItem.appearance は設定していない。ネットで色々調べたが最初は原因がわからなかった。 コードを見なおしていると appearanceを設定している箇所 [UITableViewCell appearance].separatorInset にふと気が付き、試しにこれをコメントアウトしたところ正常動作するようになった。これが原因だったか。

これでモーダルビューの表示は解決したが、このままだと境界線が切れたままになるので境界線の設定を別の方法を使う必要がある。調べたら下記サイトが参考になった。

AmebaアプリのiOS7対応時に行ったUI実装

appearanceで一律変更設定をするのではなく Interface Builder でテーブル一つ一つの Separator Insets を設定してやる。
タイプを Defaults → Custom に変更しLeft=15を Left=0にしてやる。
テーブルがたくさんある時はコードで対処するのが良さそう。自分の場合は全部手で設定した。




人気の投稿(過去 30日間)