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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

2回答

667閲覧

AutoLayoutで定められたViewのサイズ(view.frame)を用いた処理を書くのはどこが適しているのでしょう?

nasutaro211

総合スコア21

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2018/08/31 08:37

こちらの記事でUIKitのView表示のライフサイクルを勉強していたのですが、次のときどうすればいいかがわかりませんでした。よろしければご教授ください。

条件1: AutoLayoutでobject(UIViewを継承してるものたち)のサイズを決める。
条件2: AutoLayoutで定められたobjectのサイズ(object.frame)を用いて、viewが表示される前に何かをする

次のメソッド内で実行しようとすると、object.frameが定まっていなく、期待通りには動きません。

  • loadView()
  • viewDidLoad()
  • viewWillAppear()
  • updateViewConstrains()
  • viewWillLayoutSubviews()

次のメソッド内で実行しようとすると、これらのメソッドは何度か呼ばれるのでバグが起こる気がします。

  • viewDidLayoutSubViews()

次のメソッド内で実行すると、画面が表示されてしまっているのでおかしなことになります

  • viewDidAppear()

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

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

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

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

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

guest

回答2

0

viewDidLayoutSubviews()に処理を書きたいけれども、複数回呼ばれることが気になっていると思われますので。

viewDidLayoutSubviews()でUI部品の初期化とか生成を行うと、複数回呼ばれることが原因で不具合が起こりますが、
AutoLayoutによって確定したframeをもとにUI部品の座標・サイズをアップデートすることでしたら、複数回呼ばれても最新の情報に座標・サイズが合わされるだけなので問題ないという考えはどうでしょうか?

条件1については自分は、AutoLayoutStoryboardから設定するので、コードでの記載場所がどこが適切かわからないのですが、条件2についてはviewDidLayoutSubviews()で行っています。

投稿2018/08/31 12:57

編集2018/08/31 15:44
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nasutaro211

2018/08/31 16:54

無駄な処理が入ることにどこか気持ち悪さを感じるのですが、そこでも良いのでしょうか…? 書いても大丈夫なことはわかるのですが、やはり無駄な処理が入るのが少し気持ち悪いです、、、 わがままですみません。。
退会済みユーザー

退会済みユーザー

2018/08/31 17:39

僕の知識はガバガバですから、識者の回答を待たれては?とも思います。 気持ち悪いという感覚わかります。 以前調べたときは、質問文に書かれているように、layoutSubviewsしか希望する動きにならなかったんですよね。 僕の場合は書いてみて様子を見て問題がなかったので大丈夫と思うようになったんです。 処理の内容にもよるんでしょうが、調べて気軽に試してみるというのも手では無いでしょうか。 気に留めておいて問題あったら直せばいいわけですし。 僕の場合は、まあ単純な問題ですが、こんなことがありましたので参考になったらとおもって載せときます。 https://teratail.com/questions/119283 https://teratail.com/questions/121326
nasutaro211

2018/09/06 06:09

ありがとうございます!
guest

0

「updateViewConstraints」とかだとどうでしょうか?
※確かサブビューの制約更新後に呼ばれるので、ある程度の処理はできるかなと

投稿2018/08/31 15:19

Tomochika_Tomo

総合スコア166

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

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

nasutaro211

2018/08/31 17:01 編集

そこで呼ぶとまだviewのサイズが確定していなく、object.frameがCGRect.zeroになってしまっています。(今もう一度試してみました。ちゃんとsuper.viewWillLayoutSubviews()のあとでframeを確認しています。) 質問の方にも書いたのですが、`viewWillLayoutSubviews()`よりも前だとframeが確定しきっておらず、うまく取得できなかったです。
Tomochika_Tomo

2018/08/31 21:19

質問内容にできなかったとちゃんと書いていただいていましたね。 大変失礼致しました。 そうであれば、tyobigorouさんが回答されているようににviewDidLayoutSubviews()内でやることになるかなと。 frameの再設定のみであれば複数回呼ばれても挙動がおかしくなる可能性は低いですので。 frameの再設定が複数回行われるのが気持ち悪い感じでしたら、フラグ管理とかして2回目以降は再設定処理を行わないようにするとか? ※私はframeの再設定ぐらいであれば複数回実行されちゃっても良いかなって思ってしまう派です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問