web-dev-qa-db-fra.com

Quand faut-il traduire trueAutoresizingMaskIntoConstraints sur true?

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?

26
Honey

translatesAutoresizingMaskIntoConstraints doit être défini sur false lorsque:

  1. Vous créez un objet basé sur UIView- dans le code (Storyboard/NIB le définira pour vous si le fichier a le autolayout activé),
  2. Et vous voulez utiliser la mise en page automatique pour cette vue plutôt que la mise en page basée sur des cadres,
  3. Et la vue sera ajoutée à une hiérarchie de vues qui est utilise la mise en page automatique.

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 à headerdo 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

38
Paulw11
  • 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 .

17
PANKAJ VERMA