[解決済み] Xcode 8 および iOS10 以降、viewDidLayoutSubviews でビューが正しくサイズ調整されない。
質問
Xcode 8では
viewDidLoad
で、すべてのビューコントローラのサブビューのサイズは 1000x1000 で統一されているようです。奇妙なことですが、大丈夫です。
viewDidLoad
はビューのサイズを正しく設定するのに適した場所ではありません。
しかし
viewDidLayoutSubviews
は!?
そして現在のプロジェクトでは、ボタンの大きさを印刷しようとします。
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
NSLog(@"%@", self.myButton);
}
ログにはmyButtonのサイズが(1000x1000)と表示されます! その後、例えばボタンクリックでログを取ると、ログには通常の大きさが表示されます。
autolayoutを使っています。
バグなのでしょうか?
どのように解決するのですか?
Interface Builderでは、storyboardの各ビューコントローラのサイズを動的に変更し、特定のデバイスの大きさをシミュレートすることができます。
この機能を使う前は、ユーザーは各ビューコントローラーのサイズを手動で設定する必要がありました。そのため、ビューコントローラは特定のサイズで保存され、そのサイズは
initWithCoder
で初期フレームを設定するために使用されていました。
さて、どうやら
initWithCoder
は、storyboard で定義されたサイズを使用せず、viewcontroller のビュー & そのすべてのサブビューに 1000x1000 px のサイズを定義してください。
ビューは常にこれらのレイアウトソリューションのいずれかを使用する必要があるため、これは問題ではありません。
-
autolayout、およびすべての制約は、あなたのビューを正しくレイアウトします。
-
autoresizingMaskは、制約を持たない各ビューをレイアウトし、( note autolayoutとmargin制約が同じviewで互換性があるようになりました \o/ ! )
しかし、この
は
のようなビューレイヤーに関連するすべてのレイアウトの問題です。
cornerRadius
のようなビューレイヤーに関連するすべてのレイアウトの問題であり、どちらも
autolayout
も
自動サイズ調整マスク
はレイヤープロパティに適用されます。
この問題に答えるために、一般的な方法は
viewDidLayoutSubviews
を使うか、あるいは
layoutSubview
になります。この時点で (忘れずに、彼らの
super
相対メソッドを呼び出すことを忘れないでください)、あなたはすべてのレイアウトが行われたことを確信しています!
きれい というのは確かですか?ハム...完全にではありません、私は発言しました、そして、それが私がこの質問をした理由です、いくつかのケースでは、このメソッドでビューはまだ1000x1000のサイズを持っています。私は、私自身の質問に対する答えがないように思います。それについて最大限の情報を与えるために。
1- それはセルをレイアウトするときだけ起こります! で
UITableViewCell
&で
UICollectionViewCell
のサブクラスです。
layoutSubview
は呼び出されません。
の後に
の後に呼び出されないので、サブビューが正しくレイアウトされます。
2- @EugenDimboiu が発言したように (あなたにとって有用であれば、彼の答えをアップヴォートしてください)、以下のように呼び出します。
[myView layoutIfNeeded]
を呼び出すと、レイアウトされていないサブビューがちょうどよいタイミングで正しくレイアウトされます。
- (void)layoutSubviews {
[super layoutSubviews];
NSLog (self.myLabel); // 1000x1000 size
[self.myLabel layoutIfNeeded];
NSLog (self.myLabel); // normal size
}
3- 私の意見では、これは間違いなくバグです。私はそれをレーダー (id 28562874) に提出しました。
PS: 私は英語ネイティブではないので、私の文法を修正する必要がある場合は、私の投稿を編集して自由に感じなさい;)
PS2: もし、もっと良い解決策があれば、他の回答を書かなくて結構です。受理された回答は移動します。
関連
-
制御が非ボイド関数の終了に達する
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] カスタムオブジェクトを含むNSMutableArrayをソートするにはどうすればよいですか?
-
[解決済み] 奇妙な不要なXcodeログを隠す
-
[解決済み] SwiftでUIAlertViewを作成するにはどうしたらいいですか?
-
[解決済み] UIButtonのタイトルを左揃えにするにはどうしたらよいですか?
-
[解決済み] Swift 3, 4, 5 で dispatch_after GCD を書くにはどうしたらいいですか?
-
[解決済み] ぼかしの入ったオーバーレイビューの作成
-
[解決済み] Swiftで配列に要素を追加する
-
[解決済み] Autolayout を使用して UIScrollview に制約を設定するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] iOSまたはmacOSで、インターネット接続が有効かどうかを確認するにはどうすればよいですか?
-
[解決済み] Xcodeにおけるバージョンとビルドの比較
-
[解決済み] iOS7でスタイルUITableViewStyleGroupedを持つUITableViewの上部に余分なパディングがあるのはなぜですか?
-
[解決済み] iOS 8 UITableViewのセパレータインセット0が機能しない件
-
[解決済み] UITextFieldのテキスト変更イベント
-
[解決済み] UITextViewのマージン/パディングをなくす方法
-
[解決済み] Swift 3, 4, 5 で dispatch_after GCD を書くにはどうしたらいいですか?
-
[解決済み] UIImageのサイズを変更する最も簡単な方法?
-
[解決済み] UITextBorderStyleNoneを使用してUITextFieldのパディングを設定する
-
[解決済み] Cocoapods警告 - CocoaPodsがプロジェクトの基本構成を設定しなかった理由は、プロジェクトに既にカスタム構成が設定されているためです。