だから私は制約に不慣れです。
複数のビューを兄弟として含むnibファイルがあります。ViewController のビューには tableView が含まれており、tableHeaderView に追加される別のビューがあります (self.tableHeaderView と呼びましょう)。
私が直面している問題は、特定の条件に基づいて self.tableHeaderView のサイズを変更したいということです。すべての UI 要素に制約を追加しましたが、何らかの理由で nib を介して self.tableHeaderView に高さの制約を追加できません。
self.tableHeaderView のフレームをプログラムで変更しようとしましたが、シミュレーターでコードを実行しても効果がありません。これは、自動レイアウトを使用するとフレームの変更を無視する必要があるためです。
プログラムで高さの制約を追加しようとしましたが、クラッシュします。
これは、高さの制約を追加するコードです。
[self.tableHeaderView addConstraint:[NSLayoutConstraint constraintWithItem:self.tableHeaderView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:107.0f]];
私が得た例外: *** -[UITableView layoutSublayersOfLayer:]、/SourceCache/UIKit_Sim/UIKit-2903.2/UIView.m:8536 でのアサーションの失敗
* キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: '-layoutSubviews の実行後も自動レイアウトが必要です。-layoutSubviews の UITableView の実装は、super.'* を呼び出す必要があります。
最悪のシナリオでは、2 番目の高さを持つ別の兄弟ビューを追加し、UI 要素を複製しますが、これは避けたいと思います。
編集1:私はこのself.topicHeaderView.translatesAutoresizingMaskIntoConstraints = NO;を持っているときにその例外を受け取ります。
持っていない場合は、これを取得します
制約を同時に満たすことができません。おそらく、次のリストの制約の少なくとも 1 つが望ましくないものです。これを試してみてください: (1) 各制約を見て、どれが予期しないものかを把握してみてください。(2) 不要な制約を追加したコードを見つけて修正します。(注: 理解できない NSAutoresizingMaskLayoutConstraints が表示されている場合は、UIView プロパティ translatesAutoresizingMaskIntoConstraints のドキュメントを参照してください) ( "", "" )
制約を破って回復を試みます
objc_exception_throw で中断して、デバッガーでこれをキャッチします。にリストされている UIView の UIConstraintBasedLayoutDebugging カテゴリのメソッドも役立つ場合があります。
編集: 2 4 インチの画面では問題なく表示されます (予想どおり、赤い背景が tableHeaderView 全体を覆っています)
3.5 インチの画面では、赤の背景 (ペン先に適用され、高さを 117.0f に設定しても特定の高さまで伸びます。tableHeaderView 内にある UI 要素は正しく表示されます)
下部の青い線は区切り線で、青い境界線は tableHeaderView を囲んでいます。