質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Q&A

解決済

2回答

2848閲覧

iOSアプリの古いxibファイルのレイアウトが崩れる問題

takesita

総合スコア10

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

0グッド

0クリップ

投稿2017/01/20 07:01

###前提・実現したいこと
Xcode8を使用してiOSアプリを保守・開発しています。アプリ自体はiOS4の時代に作られたものを引き継ぎ、少しずつ手直ししながらメンテし続けています。
今回、Deployment Target をiOS6.0に変更しました。変更した理由は、実行中に Unrecognized selector [UIDeviceRGBColor length] というエラーで落ちてしまっていたのですが、xibファイルの Target For を 5.1 より新しいものに変更すれば良いという情報を得たからです。
xibファイルの Target For を 6.0 に変更し、プロジェクトの Deployment Target を 6.0 にしました。

###発生している問題・エラーメッセージ
xibファイルの Target For を変更してコンパイルしたところ、画面のレイアウトが崩れて表示される画面がいくつか発生してしまいました。崩れるパターンは:
1.画面の下端から高さ分だけマイナスした座標にセットしたパーツが表示されない
2.画面幅いっぱいにデザインされているパーツが画面幅の8割くらいの幅で表示される
3.画面幅いっぱいにデザインされているパーツが右側にはみ出て表示される(右側は見切れてしまい読めない)

手元の実機は iPod touch 5G と iPhone6 ですが、どちらも同様にはみ出たり、小さくなったりして表示されました。iPhone6は互換モード(横幅320)で表示されていると思われます。

右側にはみ出て表示されるパーツが乗っているViewの幅をNSLogで表示させてみたところ、iPod touch 5G は画面幅320ピクセルのはずですが、375と表示されました。

NSLog(@"w=%d", (int)self.view.frame.size.width); //375と表示

(375という数字は、375×2=750、つまりiPhone6/7のピクセル数っぽいです)

###試したこと
画面上のパーツのレイアウトは viewDidLayoutSubviews の中で行うという情報がありましたので、viewDidLayoutSubviews の中で画面幅を self.view.frame.size.width にセットし直すようなコードを書きましたが、変わりませんでした。

-(void)viewDidLayoutSubviews { CGRect frame = resultLabel.frame; frame.size.width = self.view.frame.size.width; [resultLabel setFrame:frame]; [self.view layoutIfNeeded]; }

(最後に layoutIfNeeded を呼ぶと良いという情報があったので追加しましたが、変わりませんでした)

そこで、Interface Builder の画面を見ると View as iPhone7 という表示があり、クリックすると他に iPhone7 Plus, iPhoneSE, iPhone 4S が選択できることがわかり、試しに iPhoneSE を選択してコンパイルし直したら、はみ出しなどがなくなり、想定通りのレイアウトで表示されました。

###疑問
View as iPhone7 の部分を iPhoneSE に変更することで、iPod touch 5G で正しい表示になったのですが、この機能はあくまでもデザイン時のプレビュー機能と解釈していたのですが違うのでしょうか。

もしこの設定がコンパイル結果に影響するとなると、iPhone7 Plus, iPhone7, iPhoneSE などごとに設定を変更しなければならなくなり、おかしなことになってしまうと思います。

どのように修正するのが良いのかわからなくなってしまいました。何かアドバイスがありましたらお願いします。

###開発環境について
言語は Objective-C です。先日 Xcode 8.2.1 にアップデートしました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Xcode 8.2.1にアップデートしてStoryboardxibを開いた時に端末サイズを設定するようなアラートが出なかったですか?

もしかすると配置しているStoryboardxibのサイズ自体が変更されたかもしれないので、そのサイズを確認してみてください。

投稿2017/01/20 11:27

_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takesita

2017/01/23 08:44

回答ありがとうございます。 Xcode 8.2.1 にアップデートしたときも含めて、端末サイズに関するアラートは表示されなかったと思います。 実は自己解決しまして、これから自己解決の書き込みをしようと思っているところですが、viewDidLayoutSubviews で解決したと思います。質問を書き込んだときは、viewDidLayoutSubviews 内での書き方にミスがありうまく設定できていなかったようです。
guest

0

自己解決

viewDidLayoutSubviewsの中での処理を見直したところ、想定通りの動きをするようになりました。
今頃iOS6.0に対応する作業をしている人は少ないと思いますが、viewDidLayoutSubviews を適切に記述する必要があるということがわかりました。

投稿2017/01/23 08:47

takesita

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問