ドキュメント を読みました。しかし、いつそれを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
}
コード内の何かを変更する必要があるときはいつでも、translatesAutoresizingMaskIntoConstraints
をfalse
に設定する必要があると思いました。
おそらく、すべての制約を削除してからfalse
に設定してから、必要なものを追加する必要がある場合、4つの側面すべてに制約を追加する必要があると言う方が正しいでしょう。
ただし、システムが提供するものだけを保持する必要がある場合は、この場合、tableViewがその位置と幅を管理し、true
のままにします。
そうですか?
translatesAutoresizingMaskIntoConstraints
は、次の場合にfalseに設定する必要があります。
UIView
ベースのオブジェクトを作成します(ファイルで自動レイアウトが有効になっている場合、Storyboard/NIBが設定します)。この場合、これらすべてが当てはまるわけではありません。具体的には、ポイント2。
viewForHeaderInSection
からヘッダービューを返すと、テーブルビューに追加され、そのframe
は、現在のテーブルビューの幅とheightForHeaderInSection
から返される高さに基づいて設定されます。
サブビューをルートヘッダービューに追加し(コードのheader
)、制約を使用して、ヘッダービューを基準にしてこれらのサブビューをレイアウトできます。
コメントでヘッダービュー自体に自動レイアウトを使用できない理由を発見しました。ビューを作成する時点では、ビューはまだビュー階層の一部ではないため、エッジを何にも制限できません。
動的なヘッダーサイズを設定するには、header
ビューにサブビューを追加し、それらのサブビューとheader
の間に制約を追加する必要があります。次に、自動レイアウトはheader
の固有のコンテンツサイズを使用して、ヘッダービューのサイズを決定できます。
header
のフレームを制約していないため、translatesAutoresizingMaskIntoConstraints
をfalse
に設定しないでください。自動レイアウトがheader
のサイズを決定するために、サブビューに十分な制約があることを確認する必要があります。
サブビューの本質的なコンテンツサイズが十分でない場合、サブビューには上から下への連続した制約線と、潜在的にサブビューの高さ制約が必要になります。
header
に追加するすべてのサブビューdo need translatesAutoresizingMaskIntoConstraints
set to false
また、somethingからestimatedHeightForHeaderInSection
を返す必要があります-実際のヘッダーの高さに近いほど良い-tableview.sectionHeaderHeight = UITableViewAutomaticDimension
を使用している場合
プログラムで作成されたビューのデフォルトはtrueであり、Interface Builderからのビューのデフォルトはfalseです
プロパティがTrue(または設定)の場合、システムはビューのフレームとその自動サイズ変更マスクに基づいて一連の制約を自動的に作成します。また、独自の制約を追加すると、必然的にconflictと自動生成された制約が追加されます。これにより、満足できないレイアウトが作成されます。したがって、プログラムでビューをインスタンス化するときは、必ずtranslatesAutoresizingMaskIntoConstraintsプロパティを[〜#〜] no [〜#〜]に設定してください。