web-dev-qa-db-fra.com

Xcode 8 UIButtons avec des contraintes n'apparaissant pas

Tout fonctionnait très bien jusqu'à hier, j'ai mis à jour Xcode vers la version 8.

Si je n'utilise aucune contrainte, je peux voir les boutons, mais lorsque j'applique une ou plusieurs contraintes, ils disparaissent, peu importe le nombre de contraintes (hauteur, espacement vertical, fin, etc.) que j'applique.

Lorsque j'appuie sur les boutons, ils agissent normalement (les événements sont toujours envoyés, donc je suppose qu'ils sont réellement situés là-bas (?)). J'ai essayé de changer la couleur du texte, la couleur de fond (même en ajoutant un nouveau UIButton) mais je n'ai pas eu de chance. Je ne vois pas les boutons. Lorsque je change la couleur de fond de Centered View, je peux voir ce changement sur l'application. La partie la plus étrange, c’est que lorsque je clique sur Debug View Hierarchy sur Xcode pour voir ce qui se passe, tout semble aller pour le mieux; Je peux voir tous les boutons situés comme je l’attendais.

 Constraints  Design

Test de l'application sur iPhone 5 (iOS 9.3.5) et iPhone 6 (iOS 10).

J'utilise Swift 2.3, iOS 10 et Xcode 8.

Est-ce un bug sur Xcode 8? Comment résoudre ce problème?

METTRE À JOUR:

Je viens de réaliser que le même problème de contrainte se produit également sur UILabel et UIImageView. Ils ont l'air bien sans contrainte, mais lorsque j'ajoute une contrainte, ils disparaissent.

15
JustWork

Je manquais le point de définir la classe UIButton à ma classe personnalisée. J'ai vérifié ma classe personnalisée et j'ai vu que je définissais le rayon de l'angle sur la méthode awakeFromNib(). J'ai appelé layoutIfNeeded() avant de définir le rayon du coin, ce qui était la solution dans mon cas.

2
JustWork

Ceci a été résolu en forçant la présentation avant de définir des propriétés liées à la présentation telles que clipToBounds, etc. La partie délicate consiste à savoir où et quand appeler layoutIfNeeded

Dans mon cas, j'ai un UIButton avec des contraintes horizontales, supérieures et de hauteur. Apparemment sur Xcode 8, le titre de mon bouton a soudainement disparu. Puis, assez bizarre, le titre est apparu après avoir supprimé la contrainte de hauteur. Ce comportement indique un problème probablement dans le cycle de présentation de la vue. J'avais besoin de la contrainte de hauteur et le supprimer n'était donc pas vraiment la solution. J'ai donc essayé d'appeler layoutIfNeeded avant de définir les contraintes, mais aucun effet. 

Je génère ce bouton sur viewDidLoad sur un contrôleur via une classe NSObject qui le gère. La solution pour moi était de forcer une layoutIfNeeded avant d'appeler la méthode qui a configuré le bouton.

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view layoutIfNeeded];
    //editBooking - NSObject class where the button gets configured.
    [_editBooking setUpViews];
}

Problèmes liés: clipsToBounds empêche UIImage de s'afficher dans iOS10 et XCode 8

Modifier:

"Je pense que l'initialisation liée (0, 0, 1000, 1000) est la nouvelle méthode Xcode instancie les vues à partir de IB. Avant Xcode8, les vues étaient créées Avec leur taille configurée dans xib, puis redimensionnées conformément à l’écran juste après. Mais à présent, il n’ya pas de taille configurée dans le document IB En effet, la taille dépend de la sélection de votre périphérique (au bas de l’écran ). "

Référence: Depuis Xcode 8 et iOS10, les vues ne sont pas dimensionnées correctement sur viewDidLayoutSubviews

Notes de publication Apple:

L'envoi de layoutIfNeeded à une vue ne devrait pas déplacer la vue, mais dans les versions précédentes, si la vue translatesAutoresizingMaskIntoConstraints était définie sur NO et si elle était positionnée par des contraintes, layoutIfNeeded déplacerait la vue pour qu'elle corresponde au moteur de présentation avant l'envoi de la mise en page. le sous-arbre . Ces modifications corrigent ce comportement et la position du destinataire et généralement sa taille ne seront pas affectées par layoutIfNeeded.

Certains codes existants peuvent s’appuyer sur ce comportement incorrect qui est maintenant corrigé. Il n'y a pas de changement de comportement pour les fichiers binaires liés avant iOS 10, mais lors de la construction sur iOS 10, vous devrez peut-être corriger certaines situations en envoyant -layoutIfNeeded à une vue d'ensemble de la vue translatesAutoresizingMaskIntoConstraints qui était le destinataire précédent, ou bien en la plaçant avant et en la dimensionnant ( ou après, selon votre comportement souhaité) layoutIfNeeded.

Référence: Notes de publication iOS10

20
Teffi

Je viens de trouver la solution. Il s’agit probablement d’un bogue Xcode 8. J'ai aussi fait face à ce problème.

La solution consiste à changer la version de Xcode dans le constructeur d'interface.

Pas,

  1. Sélectionnez votre fichier .xib. 

  2. Ouvrez la section Utilitaires.

  3. Sélectionnez "Inspecteur de fichier"

  4. Sous "Interface Builder Documents", remplacez la version Xcode de "Ouvre dans" par "Xcode 7.x".

Je crois que ceci vous aidera.

4
MacKa

Je ne sais pas si c'est un bug, mais je l'ai résolu en ajoutant self.layoutIfNeeded() sur la méthode awakeFromNib(). Juste au cas où, je sous-classe UIButton...

MAIS si vous ne le faites pas, vous ne pouvez pas résoudre le même problème en ajoutant cette ligne de code (du moins, vous ne pouvez pas utiliser cette version de Xcode). Utiliser viewDidLayoutSubviews() ne fonctionne pas trop ...

1
Javier Siancas

Confirmé qu'il s'agit d'un problème lié à XCode 8 actuellement (à compter du 19 octobre) distribué via App Store. Il supprime inutilement un élément <rect/> des fichiers Storyboard/xib.

Aucune des solutions de contournement layoutIfNeeded ne fonctionne pour moi. J'ai fini par télécharger XCode 8 Beta 3 qui a résolu ce problème.

1
John Wu

Il semble que Xcode 8.1 Beta 2 (8T46g) corrige le problème de taille du contenu 1000x1000 (et bien sûr, les problèmes de mise en page automatique dans les cellules de la vue tableau/collection). Donc, ce qui marche dans Xcode 7.x marche sans problèmes dans Xcode 8.1 Bêta 2.

0
Claudiu Matei

les contraintes pour scrollview doivent être: top,bottom,leading,trailing

la contrainte pour contentview dans scrollview doit être: top,bottom,leading,trailing,fixed height and center x(horizontally in container)

0
Lion