5

だから私は制約に不慣れです。

複数のビューを兄弟として含む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 要素を複製しますが、これは避けたいと思います。

Nibファイル構造

編集1:私はこのself.topicHeaderView.translatesAutoresizingMaskIntoConstraints = NO;を持っているときにその例外を受け取ります。

持っていない場合は、これを取得します

制約を同時に満たすことができません。おそらく、次のリストの制約の少なくとも 1 つが望ましくないものです。これを試してみてください: (1) 各制約を見て、どれが予期しないものかを把握してみてください。(2) 不要な制約を追加したコードを見つけて修正します。(注: 理解できない NSAutoresizingMaskLayoutConstraints が表示されている場合は、UIView プロパティ translatesAutoresizingMaskIntoConstraints のドキュメントを参照してください) ( "", "" )

制約を破って回復を試みます

objc_exception_throw で中断して、デバッガーでこれをキャッチします。にリストされている UIView の UIConstraintBasedLayoutDebugging カテゴリのメソッドも役立つ場合があります。

編集: 2 4 インチの画面では問題なく表示されます (予想どおり、赤い背景が tableHeaderView 全体を覆っています) 4

3.5 インチの画面では、赤の背景 (ペン先に適用され、高さを 117.0f に設定しても特定の高さまで伸びます。tableHeaderView 内にある UI 要素は正しく表示されます)

3.5

下部の青い線は区切り線で、青い境界線は tableHeaderView を囲んでいます。

4

2 に答える 2