J'ai lu le documentation . Mais je ne suis toujours pas sûr de la nécessité de ne pas le définir sur false
. Dans le code ci-dessous, si je le règle sur false
, l'en-tête ne sera pas visible. Si je le laisse comme true
, alors tout va bien.
Ce qui suit dans View hiérarchie de débogage donnera un avertissement " width et position sont ambigus ".
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
}
Je pensais que chaque fois que je devrais modifier quelque chose dans le code, je devrais définir translatesAutoresizingMaskIntoConstraints
sur false
.
Peut-être est-il plus correct de dire que si vous devez supprimer toutes ses contraintes, définissez-le sur false
, puis ajoutez ce que vous voulez, et dans ce cas, vous devrez ajouter des contraintes pour les 4 côtés.
Cependant, si vous avez juste besoin de conserver ce que le système vous fournit, dans ce cas, la tableView gérerait sa position et sa largeur, puis laissez à true
.
Est-ce correct?
translatesAutoresizingMaskIntoConstraints
doit être défini sur false lorsque:
UIView
- dans le code (Storyboard/NIB le définira pour vous si le fichier a le autolayout activé),Dans ce cas, toutes ne sont pas vraies. Plus précisément, le point 2.
Une fois que vous avez renvoyé la vue d'en-tête de viewForHeaderInSection
, il est ajouté à la vue tabulaire et sa valeur frame
est définie en fonction de la largeur actuelle de la vue tabulaire et de la hauteur renvoyée de heightForHeaderInSection
.
Vous pouvez ajouter des sous-vues à la vue d'en-tête racine (header
dans votre code) et utiliser des contraintes pour mettre en forme ces sous-vues par rapport à la vue d'en-tête.
Vous avez découvert la raison pour laquelle vous ne pouvez pas utiliser autolayout pour l'affichage d'en-tête dans vos commentaires. Au moment de la création de la vue, celle-ci ne fait pas encore partie de la hiérarchie des vues et vous ne pouvez donc pas limiter ses contours à quoi que ce soit.
Pour obtenir un dimensionnement dynamique des en-têtes, vous devez ajouter des sous-vues à votre vue header
et des contraintes entre ces sous-vues et header
. Ensuite, la mise en page automatique peut utiliser la taille de contenu intrinsèque de header
pour déterminer la taille de la vue d'en-tête.
Puisque vous ne contraignez pas le cadre de header
, ne définissez pas translatesAutoresizingMaskIntoConstraints
sur false
. Vous devrez vous assurer que vous avez suffisamment de contraintes sur vos sous-vues pour que la disposition automatique puisse déterminer la taille de header
.
Vous aurez besoin d'une ligne continue de contraintes de haut en bas et éventuellement de certaines contraintes de hauteur pour vos sous-vues si la taille de contenu intrinsèque de cette sous-vue n'est pas suffisante.
Toutes les sous-vues que vous ajoutez à header
do ont besoin de translatesAutoresizingMaskIntoConstraints
défini sur false
Vous devez également renvoyer quelque chose de estimatedHeightForHeaderInSection
- plus vous êtes proche de la hauteur de votre en-tête, mieux c'est - si vous utilisez tableview.sectionHeaderHeight = UITableViewAutomaticDimension
La valeur par défaut pour la vue créée par programme est true et pour les vues de Interface Builder, false.
Si la propriété est (ou définie sur) True, le système crée automatiquement un ensemble de contraintes basé sur le cadre de la vue et son masque de redimensionnement automatique. Et si vous ajoutez vos propres contraintes, elles inévitablement conflit avec les contraintes générées automatiquement. Cela crée une mise en page non satisfaisante. Ainsi, lors de l'instanciation de vues par programme, veillez à définir leur propriété translatesAutoresizingMaskIntoConstraints sur NO .