Xcode 9 - «Les contraintes de largeur fixe peuvent provoquer un découpage» et autres avertissements de localisation

148

J'ai téléchargé le nouveau Xcode et dans Interface Builder, j'ai une tonne de problèmes avec les avertissements qui disent des choses comme:

Les contraintes de largeur fixe peuvent provoquer un écrêtage

Cela ressemble à ceci:

entrez la description de l'image ici

J'ai une localisation pour plusieurs langues et je comprends l'avertissement que dans une autre langue la taille d'une étiquette peut changer, mais mon application n'a pas ce problème. Je l'ai couru et testé dans Xcode 8 hier, c'était bien. Je ne veux pas passer des heures et des heures à ajouter de nouvelles contraintes inutiles.

Des solutions suggérées?

Dave G
la source
Je vous suggère de regarder la redimensionnement automatique
Dark Innocence
3
Pareil ici. Il existe des boutons garantis d'une largeur de 50 pt dans toutes les langues. Pourquoi souiller mon rapport de mise en page automatique autrement propre avec cela?
John Scalo
9
C'est définitivement un énorme problème, et c'est surprenant qu'on n'en parle plus: O
Fattie
2
J'obtiens cette erreur même en n'ayant qu'une localisation en anglais.
Shades
6
Pour les autres, si vous n'avez PAS de localisations et que vous souhaitez simplement que ces avertissements disparaissent, déplacez votre storyboard hors du dossier Base.iproj comme indiqué ici: stackoverflow.com/a/45040394/1807644
William T.

Réponses:

179

J'obtenais les mêmes avertissements même sans plusieurs langues dans mon application , ce qui m'a amené à découvrir ce qui se passait vraiment. . .

Il se passe plusieurs choses différentes ici. J'ai pu désactiver les avertissements de largeur fixe dans ma propre application en modifiant la largeur des espacements des objets de largeur fixe à supérieure ou égale ou inférieure ou égale .

Cela peut être fait en sélectionnant l'objet dans le générateur d'interface, en accédant à l'inspecteur de taille et en le modifiant ici:

entrez la description de l'image ici


Ou, sélectionnez la contrainte dans le contour du document, accédez à l'inspecteur de taille et modifiez-la ici:

entrez la description de l'image ici



En ce qui concerne l'avertissement en haut de votre capture d'écran:

Les contraintes de début et de fin fixes avec une contrainte de centre peuvent provoquer un écrêtage

Voici une capture d'écran de ma propre application dans laquelle je recevais exactement le même avertissement:

entrez la description de l'image ici

J'ai eu l'étiquette avec le signe @ défini sur le début et la fin des boutons, mais aussi pour aligner le centre avec l'étiquette de notation . Une fois que j'ai supprimé la contrainte d'alignement central , l'avertissement a disparu, mais je me suis retrouvé avec un ensemble d'objets mal disposés.

C'est alors que je me suis résigné à adopter la Stack View . Aussi ennuyeux que cela puisse être à utiliser, lorsque vous maîtrisez toutes les contraintes et tous les paramètres, il se présente magnifiquement et sans avertissement.


Éditer

Comme Repose l' écrit dans les commentaires, parfois simplement ajouter> = 0 sera ce dont vous avez besoin, car vous vous assurez que deux éléments ne se chevauchent pas.

Nuances
la source
2
> = 0 empêche le chevauchement et corrige les problèmes de chevauchement que j'avais auparavant, la conversion de début / fin en droite / gauche a corrigé l'erreur d'écrêtage pour moi. Les résultats peuvent varier. Veuillez consulter votre médecin avant de commencer tout développement logiciel.
Repose
@Repose Exactement. Pensez à ce qui peut mal tourner et ajoutez une contrainte pour vous assurer que ce n'est pas le cas.
Teintes du
Résigné à utiliser Stack View dans iOS, c'est peut-être correct, mais pour OS X (désolé MacOS), ce n'est pas toujours un bon choix. Apple devrait le savoir. Le concept d'interface utilisateur et d'UX a souvent des hypothèses différentes.
Joannes
2
Je suis d'accord avec l'adoption d'UIStackView. Cela a vraiment été pénible et j'ai essayé de le faire avec quelques contraintes, j'ai ajouté un autre UIStackView et il s'est présenté parfaitement.
templeman15
1
Existe-t-il une autre option - Que faire si je souhaite que mon contrôle soit de largeur fixe?
Kampai
60

Vous pouvez essayer de désactiver "Respecter la direction de la langue" par contrainte pour faire taire l'avertissement et voir si cela aide. Sélectionnez votre contrainte et ouvrez l'inspecteur Attributs / Taille. Veuillez voir l'image ci-jointe.

Si vous ne prévoyez pas de localiser votre application dans d'autres langues, cette solution ne devrait pas avoir de solution de secours. Pour les applications localisées, vous devez être plus conscient de votre étiquette et de la taille de votre police.

ps Cette solution fonctionne pour iOS. Pour macOS, essayez> = ou <= pour désactiver l'avertissement.

pps Les étiquettes dans l'image ci-dessous sont beaucoup plus faciles à créer à l'aide de la mise en page automatique et de la propriété attribuéeString sur un seul UILabel ou UITextView à l'aide de NSMutableAttributedString. L'image est uniquement à des fins de démonstration.

Manque de respect de la direction linguistique

Repos
la source
1
Correction du problème "Les contraintes de début et de fin fixes avec une contrainte de centre peuvent provoquer un écrêtage" pour moi. Merci!
toddg le
4
Si vous avez essayé cela et que cela ne semble pas avoir d'effet, essayez de quitter Xcode et de le redémarrer. Cette astuce a fonctionné pour moi.
T'Pol
2
Cela ne me permettra pas de désélectionner ceci.
Scooter du
1
Parfait! cela a fonctionné pour moi et pas besoin de changer mes contraintes, merci!
rgkobashi
1
> = les contraintes ont eu des effets néfastes sur moi en raison de divers schémas de priorité complexes. J'étais prêt à insérer mon étiquette dans une vue, mais j'ai ensuite trouvé votre solution qui a fait l'affaire! Merci :)
KerCodex
33

Pour les étiquettes et les boutons localisés, cet avertissement est logique et vous devez fournir les contraintes nécessaires pour que vos étiquettes ne se chevauchent pas. S'ils ne se chevauchent pas maintenant, ils pourraient le faire à l'avenir, il ne sera donc pas inutile de fournir les contraintes.

Xcode vous aide à ajouter automatiquement ces contraintes:

Dans le contour du document de votre storyboard, cliquez sur la flèche jaune et choisissez «interligne fixe» ou «fin fixe», selon l'emplacement du texte sur votre écran (gauche ou droite). Cela résoudra le problème pour la plupart des problèmes.

Capture d'écran Xcode

Si vous rencontrez ce problème avec un bouton sans texte (image uniquement), essayez de supprimer le "titre par défaut" qui peut encore être défini pour le bouton:

Capture d'écran Xcode

Pascal
la source
4
Dans mon cas, la suppression du titre par défaut a supprimé l'avertissement. Merci!
Reinhard Männer
Notez que lorsque vous ajoutez un UIButtonà Storyboard, le default buttontitre sera button.
Miguel Tepale le
29

Avec Labels, vous pouvez définir Linesis 0et Autoshrinkproperties Minimum Font Sizepour supprimer les Fixed Width Constraints May Cause Clippingavertissements, comme ceci:

entrez la description de l'image ici

Roi Lion
la source
3
Oui, vous n'avez besoin que de définir les lignes à 0.
Reefwing
2
La valeur 0 des lignes de réglage entraîne l'extension de l'étiquette à autant de lignes que nécessaire, ce qui peut ne pas être ce que vous souhaitez.
nickdnk
@nickdnk: je sais que si vous avez fixé une contrainte de hauteur pour l'étiquette, elle ne se développera pas.
Lionking
21

Une autre solution rapide!

Pour un UIButton en changeant le titre de texte brut en texte attribué a également résolu mon problème: -

entrez la description de l'image ici

essayezKuldeepTanwar
la source
A travaillé comme un charme!
artisanat le
7

Je sais que cette question a déjà reçu une réponse, mais ce que j'ai fait pour corriger cette erreur dans mon cas était d'ajouter la propriété «Rapport d'aspect», puis d'éliminer la contrainte de largeur ou de hauteur, cela fonctionnait plutôt bien et demandait moins d'effort, et j'ai réussi à garder la même sortie et adapter ma vue pour les différents appareils.

repoussé
la source
4

Swift 4, Xcode 9.1:

À propos de ce problème, je pense que votre objet ne sait pas quelle est la position centrale correcte dans le contexte de sa supervision , et en utilisant remove, supérieur à ou d'autres paramètres de début / de fin ne fonctionne la plupart du temps pas correctement. Tout d'abord, vous devez vérifier les bonnes contraintes de votre supervision.

Si votre / vos superview (s) sont correctement définis, vous pouvez essayer "d'expliquer" à votre objet quelle est la position correcte dans la vue en définissant la contrainte "horizontalement dans le conteneur" :

entrez la description de l'image ici

Alessandro Ornano
la source
2

Si vous avez besoin d'une contrainte de largeur fixe pour le bouton, définissez simplement la priorité de la contrainte de largeur sur 700.

ChikabuZ
la source
1

J'ai eu le même problème, mais lorsque je le change, >=définissez automatiquement la constante sur 0, si je choisis60 par exemple, l'avertissement apparaît à nouveau. J'étais donc dans une boucle avec le problème.

Je pourrais réparer l'incorporation de mon Labeldans unView

Editor > Embed In > View

Dans l' Labelensemble I Top, Bottom, Leadinget Trailingavecconstant = 0

contraintes

Dans Viewj'ai mis le constraintsque je m'attendais avant.

Haroldo Gondim
la source
1

J'ai eu le même problème lors du passage à Xcode 9 et j'ai trouvé une approche utile pour certains types de mises en page. Dans mon cas, je voulais un en-tête de tableau dans lequel deux colonnes (UILabels) étaient de largeur fixe et une autre était de largeur variable. Indépendamment de la façon dont j'ai spécifié les largeurs de colonne (y compris l'utilisation de contraintes supérieures ou égales au lieu d'égales, etc.), je continuais à recevoir un avertissement concernant un écrêtage possible. Dans mon cas, je voulais que la colonne à largeur variable (UILabel) soit coupée si nécessaire. J'aurais pu ignorer l'avertissement, mais je n'aime pas faire ça.

L'approche qui a fonctionné ici était de créer un UIView avec des contraintes de taille appropriées et d'incorporer le UILabel en tant que sous-vue dans l'UIView. Ensuite, la troncature se produit si nécessaire et je n'obtiens aucun avertissement. Cela fonctionne que l'UIView / UILabel incorporé soit dans un StackView ou non.

C'est essentiellement la même approche que celle d'Haroldo Gondim, mais ici vous pouvez voir que cela fonctionne également avec ou sans StackView.

L'image suivante montre l'approche, avec et sans StackView. "SpacerName" est un UIView de largeur variable contenant une étiquette et "SpacerPD" en est un avec une largeur fixe de 80. [Les couleurs ne sont pas significatives; juste là pour montrer où sont les vues.]

entrez la description de l'image ici

Tom Linton
la source
0

Comme vous pouvez le voir dans l'image ci-dessous, j'avais l'erreur «Les contraintes de largeur fixe peuvent provoquer un découpage» car bien que j'avais défini ma zone de texte pour être centrée verticalement et mon étiquette pour avoir une contrainte de marge gauche, je n'avais pas défini de contrainte pour la zone de texte par rapport à l'étiquette, donc XCode m'a alerté que la zone de texte pouvait couper (être rendue au-dessus) l'étiquette.

entrez la description de l'image ici

Après avoir ajouté la contrainte de gauche à la zone de texte pour toujours rester à une certaine distance de l'étiquette, l'erreur a été considérée comme résolue par XCode et cela ne m'a plus dérangé avec l'avertissement de contrainte.

Ulysse Alves
la source
0

J'ai eu un problème similaire en essayant d'avoir le bouton avec les mêmes rembourrages des bords de la super vue.

Cas d'erreur

J'ai fini par utiliser la horizontal centercontrainte et la equal widthscontrainte pour le super view.

Ma solution

Pei
la source
-1

Pour corriger l'erreur : les contraintes de largeur fixe peuvent provoquer un découpage »et autres localisations Vous devez sélectionner la vue / l'objet, aller dans« Afficher l'inspecteur de taille », trouver la contrainte de largeur et définir la constante sur plus grand ou égal à:

Inspecteur de taille

Pour corriger l'erreur : la contrainte de début / de fin est manquante, ce qui peut entraîner un chevauchement avec d'autres vues

Cela signifie que la vue / l'objet dont Xcode se plaint, manque une contrainte de début ou de fin à une vue voisine.

Tout en maintenant le contrôle, faites glisser vers une vue / un objet à proximité

Contrôle + PressClick

Ajouter une contrainte de début ou de fin

Contrainte de début / de fin

Manny
la source
Si vous cliquez sur le triangle d'avertissement, Xcode les créera automatiquement pour vous en un seul clic.
lensovet