TabBarController+NavigationControllerな構成でUIActionSheetがおかしい件の対策

すごく久しぶりにブログを書いてみます。


iPhoneアプリでTabBarController+NavigationControllerな構成って結構多いと思います。
この構成でアクションシートを出すと一番下のボタンの当たり判定がおかしくなります。


裏に透けてるタブバーと重なっている部分はタップに反応しません。
キャンセルボタンの上三分の一くらいのタブバーがない部分だけタップに反応します。

対策その1 showFromTabBar: を使う

ドキュメントを読んでみるとshowFromTabBar:というのがありました。
これならOKっぽいなと思って試してみます。
showFromTabBar:の引数はUITabBarです。
UITabBarってどうやってコードで取れるんだろう?って思ってみてもわからず、
IB上でアウトレットで繋いで試してみました。



当たり判定は正常に戻りました。
でも、actionSheetStyleを弄ってもないのに勝手にUIActionSheetStyleBlackOpaqueになってしまいました。
設定しても無視されます。
んんんんん。
ドキュメントにちゃんとStyleは関係ないと書かれていました。

対策その2 self.navigationController.parentViewController.view

困ってしまったので同じような状況なのに回避してるアプリはないかと探してみると
TwitterFonがありました。しかも、ソースコードも公開されています。
素晴らしい。ありがたいです。
するとこんな感じに解決していました。

[as showInView:self.navigationController.parentViewController.view];

ナビゲーションコントローラーの親のビューコントローラーが持っているビューを渡していました。
すると、見た目も任意に設定できて且つ当たり判定も正常です。


naanさんありがとうございます。


ちなみにself.navigationController.parentViewControllerはUITabBarControllerです。
これは納得ですが、そのビューはUILayoutContainerViewというUnDocumentedなクラスでした。

まとめ

showFromTabBarでactionSheetStyleが設定できないのはどうなの?Appleさん。
ドキュメント通りでした。ごめんなさい。