La largeur de présentation maximale préférée automatique n'est pas disponible sur les versions iOS antérieures à 8.0

322

J'ai ouvert un projet iOS existant avec Xcode6 beta6, et Xcode répertorie l'avertissement suivant pour les fichiers Storyboard et Xib:

La largeur de présentation maximale préférée automatique n'est pas disponible sur les versions iOS antérieures à 8.0

J'ai essayé de répondre à l'avertissement en définissant la largeur comme explicite comme ci-dessous:

Pourtant, cela n'a pas résolu les avertissements. Comment peuvent-ils être supprimés?

mono
la source
3
J'utilise XCode 6.1 et j'ai mis à jour toutes mes étiquettes en Preferred Width = Explicit. Cela a résolu le problème pour moi.
djburdick

Réponses:

373

Mise à jour 3:
cet avertissement peut également être déclenché par des étiquettes dont la valeur est différente numberOfLinesde 1 si votre cible de déploiement est définie sur 7.1. Ceci est entièrement reproductible avec un nouveau projet à vue unique.

Étapes à reproduire:

  1. Créer un nouveau projet objectif-c à vue unique
  2. Définissez la cible de déploiement sur 7.1
  3. Ouvrez le storyboard du projet
  4. Déposer une étiquette sur le contrôleur de vue fourni
  5. Définissez le nombre de lignes de cette étiquette sur 2.
  6. Compiler

J'ai déposé le radar suivant:
rdar: // problem / 18700567

Mise à jour 2:
Malheureusement, c'est à nouveau une chose dans la version finale de Xcode 6. Notez que vous pouvez, pour la plupart, modifier manuellement votre storyboard / xib pour résoudre le problème. Par Charles A. dans les commentaires ci-dessous:

Il convient de mentionner que vous pouvez facilement introduire accidentellement cet avertissement, et l'avertissement lui-même n'aide pas à trouver l'étiquette qui est le coupable. C'est malheureux dans un storyboard complexe. Vous pouvez ouvrir le storyboard en tant que fichier source et effectuer une recherche avec l'expression régulière <label(?!.*preferredMaxLayoutWidth)pour trouver des étiquettes qui omettent un attribut / valeur préféréMaxLayoutWidth. Si vous ajoutez PreferredMaxLayoutWidth = "0" sur ces lignes, cela revient à marquer explicitement et à définir la valeur 0.

Mise à jour 1:
ce bogue a maintenant été corrigé dans Xcode 6 GM.

Réponse d'origine
Il s'agit d'un bogue dans Xcode6-Beta6 et XCode6-Beta7 et peut être ignoré en toute sécurité pour l'instant.

Un ingénieur Apple sur les forums des développeurs Apple a dit ceci à propos du bogue:

La largeur de mise en page maximale préférée est une propriété de mise en page automatique sur UILabel qui lui permet de se développer automatiquement verticalement pour s'adapter à son contenu. Les versions de Xcode antérieures à 6.0 définiraient la valeur préféréeMaxLayoutWidth pour les étiquettes multilignes à la taille actuelle des limites au moment de la conception. Vous devrez mettre à jour manuellement PreferredMaxLayoutWidth au moment de l'exécution si votre disposition horizontale change.

iOS 8 a ajouté la prise en charge du calcul automatique de PreferredMaxLayoutWidth au moment de l'exécution, ce qui facilite encore plus la création d'étiquettes multilignes. Ce paramètre n'est pas rétrocompatible avec iOS 7. Pour prendre en charge iOS 7 et iOS 8, Xcode 6 vous permet de choisir "Automatique" ou "Explicite" pour PreferredMaxLayoutWidth dans l'inspecteur de taille. Vous devriez:

Choisissez "Automatique" si vous ciblez iOS 8 pour la meilleure expérience. Choisissez "Explicite" si vous ciblez <iOS 8. Vous pouvez ensuite entrer la valeur de PreferredMaxLayoutWidth que vous souhaitez définir. L'activation de "Explicit" revient par défaut à la taille actuelle des limites au moment où vous avez coché la case.

L'avertissement apparaîtra si (1) vous utilisez la mise en page automatique, (2) "Automatique" est défini pour une étiquette multiligne [vous pouvez le vérifier dans l'inspecteur de taille de l'étiquette], et (3) votre cible de déploiement <iOS 8.

Il semble que le bogue est que cet avertissement s'affiche pour les documents non à mise en page automatique. Si vous voyez cet avertissement et n'utilisez pas la disposition automatique, vous pouvez ignorer l'avertissement.

Alternativement, vous pouvez contourner le problème en utilisant l'inspecteur de fichiers sur le storyboard ou xib en question et changer «Builds for» en «Builds for iOS 8.0 and Later» Inspecteur de fichiers Xcode

memmons
la source
15
Il convient de mentionner que vous pouvez facilement introduire accidentellement cet avertissement, et l'avertissement lui-même n'aide pas à trouver l'étiquette qui est le coupable. C'est malheureux dans un storyboard complexe. Vous pouvez ouvrir le storyboard en tant que fichier source et rechercher avec l'expression régulière <label(?!.*preferredMaxLayoutWidth)pour trouver des étiquettes qui omettent un preferredMaxLayoutWidthattribut / une valeur. Si vous ajoutez preferredMaxLayoutWidth="0"sur de telles lignes, cela revient à marquer explicitement et à définir la valeur 0.
Charles A.
6
Existe-t-il un moyen de configurer par programmation un UILabel pour ajuster automatiquement PreferredMaxLayoutWidth, sans réellement le sous-classer ou l'implémenter quelque part dans layoutSubviews? S'il s'agit d'un comportement qu'IB peut activer, cela suggère qu'une propriété ou une valeur magique peut être définie. Mais rien dans les documents ou les en-têtes de l'API ne le dit.
algal
2
@CharlesA. J'ai testé avec un projet vide et j'ai trouvé un autre attribut d'étiquette qui déclenchera cet avertissement: si numberOfLinesest défini sur autre chose que 1, l'avertissement se produira, que vous l'ayez preferredMaxLayoutWidthdéfini ou non.
memmons
2
@ MichaelG.Emmons Strange, je ne peux pas reproduire cela avec un projet propre et une cible de déploiement définie sur 7.1. Une fois que j'ai défini la valeur preferredMaxLayoutWidth0 explicite, l'avertissement disparaît quelle que soit la numberOfLinesvaleur. Mais peut-être que cela a été corrigé dans la mise à jour de Xcode ce matin?
Charles A.
2
Alors ... est la seule solution pour définir le nombre de lignes à 1 et le changer de code? cela ne semble pas professionnel
jomafer
315

Pour trouver les étiquettes de problème dans un grand storyboard, suivez mes étapes ci-dessous.

  1. Dans le navigateur de problèmes de xCode, faites un clic droit sur l'erreur et sélectionnez "Révéler dans le journal". (Remarque: @Sam suggère ci-dessous, regardez dans le navigateur de rapports de xCode . @Rivera note également dans les commentaires que "À partir de Xcode 6.1.1, cliquer sur l'avertissement s'ouvrira automatiquement et mettra en surbrillance l'étiquette en conflit". Je n'ai pas testé cela ).

entrez la description de l'image ici

  1. Cela montrera l'erreur avec un code à la fin de votre fichier de storyboard. Copiez la valeur après .storyboard

entrez la description de l'image ici

  1. Ensuite, révélez votre storyboard en tant que fichier source. entrez la description de l'image ici

  2. Chercher. Vous devriez pouvoir dire de quelle étiquette il s'agit d'ici assez facilement en regardant le contenu. entrez la description de l'image ici

Une fois que vous avez trouvé l'étiquette, la solution qui a fonctionné pour moi a été de définir la «largeur préférée» à 0.

entrez la description de l'image ici

BTW, vous pouvez toujours obtenir rapidement l'identifiant d'un élément d'interface en sélectionnant l'élément et en regardant sous l'inspecteur d'identification. Très utile.

entrez la description de l'image ici

smileBot
la source
36
Cela devrait être la réponse acceptée! Cela résout en fait le problème. Cela aide même à trouver d'autres problèmes dans le Storyboard qui n'apparaissent pas normalement. Une chose: je trouve que le Navigateur de rapports est beaucoup plus fiable que de cliquer avec le bouton droit sur "Révéler dans le journal"
Sam Spencer
1
J'adore cette réponse, très simple et fixe l'avertissement. Merci beaucoup!
Ethan Parker
1
Merci beaucoup sohoohhhhhh :)
SR Nayak
2
Pourquoi définissez-vous la largeur préférée sur zéro plutôt que sur la largeur indiquée dans le générateur d'interface?
Biclops
9
Réponse géniale! Vous pouvez rechercher l'ID d'objet directement à partir de la vue IB du Storyboard. Faites juste un Ctrl-f. Pas besoin de l'ouvrir en tant que code source, puis de revenir à la vue IB pour modifier la largeur préférée.
AndroidDev
36

Vous pouvez résoudre ce problème sans ouvrir le storyboard en tant que source . Cet avertissement est déclenché par UILabels si numberOfLines! = 1 et la cible de déploiement est <8.0

COMMENT LE TROUVER?

  1. Accédez à Issue Navigator (CMD + 8) et sélectionnez la dernière version avec l'avertissement entrez la description de l'image ici
  2. Localisez le ou les avertissements (recherchez " Disposition maximale automatique préférée ») et appuyez sur le bouton de développement sur la droite
    entrez la description de l'image ici
  3. Trouver l'ID d'objet de l'UILabel entrez la description de l'image ici
  4. Ouvrez le Storyboard et RECHERCHE (CMD + f) pour l'objet. Ce sera évidence la UILabel
  5. Définir la largeur préférée = 0 "explicite" comme d'autres l'ont suggéré
Tibidabo
la source
23

Solution c'est assez simple

Activez simplement les versions pour iOS 8 et versions ultérieures

entrez la description de l'image ici

Alejandro Luengo
la source
assez simple et destructeur. Seuls 85% des utilisateurs d'iOS sont sur iOS8 + developer.apple.com/support/app-store
aryaxt
6
@aryaxt Je suis désolé de vous dire que vous vous trompez. Vous pouvez définir une cible de déploiement dans les paramètres du projet sur iOS 7 ou une version antérieure et modifier les versions des documents IB sur iOS 8 et versions ultérieures et cela fonctionnera sur iOS 7. Veuillez le vérifier et supprimer le vote négatif. Vous pouvez le vérifier ici developer.apple.com/library/ios/recipes/…
Alejandro Luengo
1
Comme toujours, la meilleure réponse n'est pas celle qui est acceptée ... :) A bientôt!
HepaKKes
MISE À JOUR pour iOS9.3 et versions ultérieures: les appareils iOS7 ne rendent plus les story-boards avec le paramètre ci-dessus. Cela fonctionnait avant la mise à jour 9.3. On dirait qu'Apple a changé quelque chose dans son processus automatisé de pré-version.
pechar
4

Maintenant, ma version Xcode est 6.1. Mais j'ai aussi reçu cet avertissement. ça m'énerve beaucoup. après avoir cherché encore et encore, j'ai trouvé la solution.

Raison: Vous devez avoir défini vos lignes UILabel> 1 dans votre Storyboard.

Solution: définissez votre attribut UILabel Lines sur 1 dans Storyboard. redémarrez votre Xcode. Cela fonctionne pour moi, j'espère que cela peut aider plus de gens.

Si vous avez vraiment besoin de montrer vos mots sur plus d'une ligne. vous devez le faire dans le code.

//the words will show in UILabel
NSString *testString = @"Today I wanna set the line to multiple lines. bla bla ......  Today I wanna set the line to multiple lines. bla bla ......"
[self.UserNameLabel setNumberOfLines:0];
self.UserNameLabel.lineBreakMode = NSLineBreakByWordWrapping;
UIFont *font = [UIFont systemFontOfSize:12];
//Here I set the Label max width to 200, height to 60
CGSize size = CGSizeMake(200, 60);
CGRect labelRect = [testString boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName] context:nil];
self.UserNameLabel.frame = CGRectMake(self.UserNameLabel.frame.origin.x, self.UserNameLabel.frame.origin.y, labelRect.size.width, labelRect.size.height);
self.UserNameLabel.text = testString;
Ronan
la source
3
"Si vous avez vraiment besoin d'afficher vos mots sur plus d'une ligne. Vous devez le faire dans le code." Ceci est un troll, non?
webstersx
@webstersx je pense qu'il est sérieux
Jasper
4

Pour résumer, pour moi, en suivant les deux instructions ci-dessus pour modifier toutes les instances où numberOfLines = 0 à 1 ou plus, et en ajoutant manuellement PreferredMaxLayoutWidth = "0" à chaque instance d'une étiquette à l'intérieur de la source du storyboard, tous mes avertissements ont été corrigés.

Lynn S
la source
Mec tu es un WIZZARD! Fonctionne même avec un UIScrollerView comme prévu. MEILLEURE SOLUTION jusqu'à présent car je pouvais laisser la cible de mon déploiement de Nib sur iOS7.0
Yaro
3

Comme je n'ai pas 50 points de réputation, Stackoverflow ne me laissera pas commenter la deuxième meilleure réponse. J'ai trouvé une autre astuce pour trouver l'étiquette coupable dans le Storyboard.

Donc, une fois que vous connaissez l'ID de l'étiquette, ouvrez votre storyboard dans un onglet séparé avec les contrôleurs de vue affichés et faites simplement la commande F et la commande V et vous amènera directement à cette étiquette :)

Junaid Ahmed
la source
Vous voulez dire la recherche dans le projet pour l'ID d'étiquette.
Borzh
2

Je l'ai fait fonctionner en sélectionnant la disposition d'origine que j'avais dans la sélection W / H. Le storyboard fonctionne comme prévu et l'erreur a disparu.

Assurez-vous également que vous développez pour iOS 8.0. Vérifiez cela dans les paramètres généraux du projet.

C'est là que vous devez appuyer.

AarneHuttunen
la source
1

J'ai eu ce problème et j'ai pu le résoudre en ajoutant des contraintes pour déterminer le max avec une étiquette.

Lorsque vous déposez une étiquette multiligne, aucune contrainte n'est définie pour appliquer la largeur à l'intérieur de la vue parent. C'est là que le nouveau PreferredMaxWidth entre en jeu. Sur iOS 7 et versions antérieures, vous devez définir vous-même la largeur maximale. J'ai simplement ajouté une contrainte de 10 pixels aux côtés gauche et droit de l'étiquette.

Vous pouvez également ajouter une contrainte <= width qui résout également le problème.

Ce n'est donc pas vraiment un bug, il vous suffit de définir vous-même la largeur max. L'option explicite mentionnée dans une autre réponse fonctionnera également lorsque vous définissez cette valeur de largeur, mais vous devrez modifier cette valeur si vous souhaitez que la largeur maximale change en fonction de la largeur du parent (car vous avez explicitement défini la largeur).

Ma solution ci-dessus garantit que la largeur est toujours conservée, quelle que soit la taille de la vue parent.

Matthew Cawley
la source
1

Pour une raison quelconque, même si vous changez la cible de déploiement iOS en 8.0 ou supérieur, les fichiers Xib n'adoptent pas cette modification et conservent les paramètres précédents dans l'inspecteur de fichiers

Inspecteur de fichiers dans le Xib après avoir changé la cible de déploiement iOS

Par conséquent, vous devez le modifier manuellement pour chaque Xib Après le changement manuel

Une fois terminé, l'avertissement disparaîtra :-)

Gutty1
la source