さくせん:いろいろやろうぜ

いろいろなことをやって、楽しみます。

iPhone App on iPad でボタンが押せない件

Landscapeモード限定のiPhoneアプリを作成した。
Universalではない。
そのアプリをiPadで動かすと・・・ボタンが反応しない。
なぜだ、ということでエントリ。
おそらく基本的なところを見落としている気がするのだが分からない。

手順
「Single View Application」で新規プロジェクトを作成
StoryBoardでViewControllerのOrientationをLandscapeにして、UIButtonを1つ貼り付ける
プロジェクトのTARGETでSupported Interface Orientationを、
・Landscape Left
・Landscape Right
にする。


これを実行すると、
iPhone→ボタンが押せる
iPad→起動直後は、ボタンが押せない。表示はされる。

ボタンが押せない状態で、「2x」ボタンを押し、2倍表示にするとボタンが押せる。「1x」を押して戻しても押せる。
ボタンが押せない状態で、上下を逆さまにもちかえrotateが発生すると押せる。

以下、個人の考察
iPadはどちらの向きに持っていても初めはPortraitで起動する。
今回はLandscapeモードオンリーであるのだが、iPadで起動したときはPortraitモードでviewが配置されてしまい座標関係がダメ?→でもView自体は正しい位置に表示されている。UIWindowの座標関係がダメ?windowの再配置、viewの再配置が行われると正しくボタンが押せるようになる印象。rotate発生後や2xボタンを押したあとはうまく動く。

Supported Interface OrientationにPortraitを追加し、supportedInterfaceOrientationsでUIInterfaceOrientationMaskLandscapeを返すとシミュレータでは動くようになった。
しかし、実機で試すと、

  • Portraitの持ち方で起動するとボタンが押せる
  • Landscapeの持ち方で起動するとボタンが押せない

というヒントになるようなならないような現象。

あとViewControllerに
 - (BOOL)shouldAutorotate でYESを返してもダメ
 - (NSUInteger)supportedInterfaceOrientations で UIInterfaceOrientationMaskLandscapeを返してもダメ

根本原因が分からず・・・。

そして、暫定的な解決方法(かなり強引)

Supported Interface Orientationを Portrait、Upside Downに設定。
 - (BOOL)shouldAutorotateでreturn YES;
 - (NSUInteger)supportedInterfaceOrientationsでUIInterfaceOrientationMaskLandscapeを返す

これでボタンが押せるようになった・・・。
こうすることで内部的に起動時にPortraitで起動するが、supportedInterfaceOrientationでLandscapeなのでrotateが発生する・・・はず。だからうまく動く・・・?
ヘルプ。

追記
この方法でAppleへアプリを提出したところ、Reviewは通りました。
なお、SupportedInterfaceOrientationをすべてオフにしても意図した動きになります。