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

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

ただいまの
回答率

90.51%

  • iOS

    4008questions

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

  • Objective-C

    1180questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 721

takesita

score -2

前提・実現したいこと

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 にアップデートしました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/23 17:44

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

    キャンセル

check解決した方法

-1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • iOS

    4008questions

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

  • Objective-C

    1180questions

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