1. ホーム
  2. ios

[解決済み] Xcode 8 および iOS10 以降、viewDidLayoutSubviews でビューが正しくサイズ調整されない。

2023-02-11 23:37:54

質問

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: もし、もっと良い解決策があれば、他の回答を書かなくて結構です。受理された回答は移動します。