Xcode6でUIImageViewのcontentModeがうまく作動しない場合の対処法
3年前にWindowsアプリとして作った雑誌時計。その時に窓の杜にとりあげていただいたら速攻で「スマホアプリは無いのか?」というツイートを数件いただいたのを思い出して、swiftの練習がてらプロトを作ってみました。
こんな感じ。(以下のトラブルをクリア後のバージョン)
雑誌の表紙をスマホのサイズいっぱいに次々と表示するだけのアプリなのですが、いきなりハマったのが画面一杯というところ。画像を表示するUIImageViewのプロパティのcontentModeにUIViewContentMode.ScaleAspectFit(Objective-CではUIViewContentModeScaleAspectFit)をセットするだけでいいはずなのだが、本田翼さんがiPhoneからはみ出るぐらい、どかーんとでる。それはそれで嬉しいのですがw
っで、contentModeに関する記述をネットで調べるとstackoverflowや国内など結構ありました。インターフェースビルダーでAdd Missing Constraintを実行とか、constraintを設定して余白を調整とか、constraintに相当するコードを足すのとか。が、記述された時期が古いためか、どれも効果無し。iOS8.1のSDKのバグかと思いました。
試しに別プロジェクトを作成し、慣れたObjective-Cで作ってみたら正常…。
はたとひらめき、viewDidLoad内に次のコードを追加して実行。
println("CGRect w=\(imageView.frame.width)")
println("CGRect h=\(imageView.frame.height)")
ビンゴ!
iPhoneの画面サイズになっているはずのUIImageView内の描画領域(frame)の縦と横が、storyboard上のほぼ正方形(610x610ぐらいの記憶)のまま。つまりiPhoneの画面よりもサイズがデカくなっちゃっているんですね。だからちゃんとcontentModeは効いているけど表示がおかしい。
でも、それならなんでインターフェースビルダーでconstraintが効かなっかったのでしよう?
試しに、こねくり回すのをやめてインターフェースビルダーでUIImageViewを削除。貼りなおしてみたらちゃんと動いた!
Xcode6以降、つまりiOS8以降ってstoryboardがiPhoneとiPadを別々に用意しなくてもよくなったぶん、インターフェースビルダーやconstraintに起因するトラブルによく合う気がします。
とにかく表示トラブルはクリアして、雑誌がじゃんじゃん切り替わったり、お気に入りの画像をアルバムに保存したりシェアできるところまでできました。
アプリはここからの仕上げが大変なんですよねー。
あとiTunesの中の人が、このアプリを理解できるのか、つまり審査を突破できるのかちょっと心配。おばあさんの画像でもエロアプリでリジェクトされたという都市伝説をどこかで読んだので。