web-dev-qa-db-ja.com

translatesAutoresizingMaskIntoConstraintsをtrueに設定する必要があるのはいつですか?

ドキュメント を読みました。しかし、いつそれをfalseに設定する必要がないのか、まだわかりません。以下のコードでfalseに設定すると、ヘッダーはまったく表示されません。 trueのままにすると、すべて問題ありません。

Viewデバッグ階層の次の警告「widthおよびpositionあいまいです」。

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let header = UIView()
    header.translatesAutoresizingMaskIntoConstraints = false
    header.backgroundColor = .orange
    header.heightAnchor.constraint(equalToConstant: 10).isActive = true

    return header
}

コード内の何かを変更する必要があるときはいつでも、translatesAutoresizingMaskIntoConstraintsfalseに設定する必要があると思いました。

おそらく、すべての制約を削除してからfalseに設定してから、必要なものを追加する必要がある場合、4つの側面すべてに制約を追加する必要があると言う方が正しいでしょう。

ただし、システムが提供するものだけを保持する必要がある場合は、この場合、tableViewがその位置と幅を管理し、trueのままにします。

そうですか?

26
Honey

translatesAutoresizingMaskIntoConstraintsは、次の場合にfalseに設定する必要があります。

  1. コードでUIViewベースのオブジェクトを作成します(ファイルで自動レイアウトが有効になっている場合、Storyboard/NIBが設定します)。
  2. また、フレームベースのレイアウトではなく、このビューに自動レイアウトを使用したい場合、
  3. そして、ビューは、自動レイアウトを使用してisであるビュー階層に追加されます。

この場合、これらすべてが当てはまるわけではありません。具体的には、ポイント2。

viewForHeaderInSectionからヘッダービューを返すと、テーブルビューに追加され、そのframeは、現在のテーブルビューの幅とheightForHeaderInSectionから返される高さに基づいて設定されます。

サブビューをルートヘッダービューに追加し(コードのheader)、制約を使用して、ヘッダービューを基準にしてこれらのサブビューをレイアウトできます。

コメントでヘッダービュー自体に自動レイアウトを使用できない理由を発見しました。ビューを作成する時点では、ビューはまだビュー階層の一部ではないため、エッジを何にも制限できません。

動的なヘッダーサイズを設定するには、headerビューにサブビューを追加し、それらのサブビューとheaderの間に制約を追加する必要があります。次に、自動レイアウトはheaderの固有のコンテンツサイズを使用して、ヘッダービューのサイズを決定できます。

headerのフレームを制約していないため、translatesAutoresizingMaskIntoConstraintsfalseに設定しないでください。自動レイアウトがheaderのサイズを決定するために、サブビューに十分な制約があることを確認する必要があります。

サブビューの本質的なコンテンツサイズが十分でない場合、サブビューには上から下への連続した制約線と、潜在的にサブビューの高さ制約が必要になります。

headerに追加するすべてのサブビューdo need translatesAutoresizingMaskIntoConstraints set to false

また、somethingからestimatedHeightForHeaderInSectionを返す必要があります-実際のヘッダーの高さに近いほど良い-tableview.sectionHeaderHeight = UITableViewAutomaticDimensionを使用している場合

38
Paulw11
  • プログラムで作成されたビューのデフォルトはtrueであり、Interface Builderからのビューのデフォルトはfalseです

    プロパティがTrue(または設定)の場合、システムはビューのフレームとその自動サイズ変更マスクに基づいて一連の制約を自動的に作成します。また、独自の制約を追加すると、必然的にconflictと自動生成された制約が追加されます。これにより、満足できないレイアウトが作成されます。したがって、プログラムでビューをインスタンス化するときは、必ずtranslatesAutoresizingMaskIntoConstraintsプロパティを[〜#〜] no [〜#〜]に設定してください。

17
PANKAJ VERMA