web-dev-qa-db-fra.com

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

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 maximale de mise en page automatique préférée 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 étant explicite, comme ci-dessous:

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

321
mono

Mise à jour 3:
Cet avertissement peut également être déclenché par des étiquettes pour lesquelles numberOfLines est défini sur une valeur autre que 1 si la cible de votre déploiement est définie sur 7.1. Ceci est complètement reproductible avec le nouveau projet à vue unique.

Étapes à suivre pour reproduire:

  1. Créer un nouveau projet single-view, objective-c
  2. Définissez la cible de déploiement sur 7.1
  3. Ouvrir le story-board du projet
  4. Déposer une étiquette sur le contrôleur de vue fourni
  5. Définissez le numberOfLines pour cette étiquette sur 2.
  6. Compiler

J'ai déposé le radar suivant:
rdar: // problème/18700567

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

Il est à noter que vous pouvez assez facilement introduire cet avertissement accidentellement, 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 story-board en tant que fichier source et effectuer une recherche à l'aide de l'expression régulière <label(?!.*preferredMaxLayoutWidth) pour rechercher les étiquettes qui omettent un attribut/une valeur preferredMaxLayoutWidth. Si vous ajoutez dans preferredMaxLayoutWidth = "0" sur de telles 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 originale
Ceci est un bogue dans Xcode6-Beta6 et XCode6-Beta7 et peut être ignoré en toute sécurité pour le moment.

Un ingénieur Apple dans les forums de développeurs Apple avait ceci à dire sur le 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 pour s’adapter à son contenu. Les versions de Xcode antérieures à 6.0 définiraient preferredMaxLayoutWidth pour les étiquettes multilignes à la taille actuelle des limites au moment de la conception. Si votre mise en page horizontale était modifiée, vous devrez mettre à jour manuellement preferredMaxLayoutWidth au moment de l'exécution.

iOS 8 prend désormais en charge le 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 une expérience optimale. Choisissez "Explicit" si vous ciblez <iOS 8. Vous pouvez ensuite entrer la valeur de preferredMaxLayoutWidth que vous souhaitez définir. L'activation de "Explicit" définit par défaut la taille actuelle des limites au moment où vous cochez 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 pour l'étiquette] et (3) votre cible de déploiement <iOS 8.

Il semble que le problème est que cet avertissement apparaît pour les documents non autolayout. Si vous voyez cet avertissement sans utiliser la mise en page automatique, vous pouvez l'ignorer.

Sinon, vous pouvez contourner le problème en utilisant l'inspecteur de fichier du storyboard ou de xib en question et remplacer "Builds for" par "Builds for iOS 8.0 and later". Xcode file inspector

373
memmons

Pour rechercher les étiquettes de problème dans un grand scénarimage, suivez les étapes ci-dessous.

  1. Dans Issue Navigator de xCode, cliquez avec le bouton droit de la souris sur l'erreur et sélectionnez "Révéler dans le journal". (Remarque: @Sam suggère ci-dessous, regardez dans navigateur de rapport de xCode. @Rivera note également dans les commentaires que "À partir de Xcode 6.1.1, un clic sur l'avertissement s'ouvrira automatiquement et surlignera l'étiquette en conflit" Je n'ai pas testé cela).

enter image description here

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

enter image description here

  1. Ensuite, révélez votre storyboard en tant que fichier source. enter image description here

  2. Chercher. Vous devriez être capable de dire facilement de quelle étiquette il s'agit d'ici en regardant le contenu. enter image description here

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" sur 0.

enter image description here

En passant, vous pouvez toujours obtenir rapidement l’id d’un élément d’interface en le sélectionnant et en regardant sous l’inspecteur d’identité. Très utile.

enter image description here

315
smileBot

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

COMMENT LE TROUVER?

  1. Accédez au navigateur de questions (CMD + 8) et sélectionnez la dernière version générée avec l'avertissement. enter image description here
  2. localisez le ou les avertissements (recherchez " Mise en page maximale préférée automatique ") et appuyez sur le bouton de développement à droite
    enter image description here
  3. Trouver l'ID d'objet de UILabel enter image description here
  4. Ouvrez le storyboard et SEARCH (CMD + f) pour l’objet. Il va SÉLECTIONNER ET METTRE EN ÉVIDENCE le UILabel
  5. Set Preferred Width = 0 "Explicit" comme suggéré par d'autres
36
Tibidabo

Solution c'est assez simple

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

enter image description here

23
Alejandro Luengo

Pour résumer, suivez les deux instructions ci-dessus pour modifier les instances où numberOfLines = 0 ou plus, et l'ajout manuel de preferredMaxLayoutWidth = "0" à chaque instance d'une étiquette à l'intérieur de la source du storyboard a résolu tous mes avertissements.

4
Lynn S

Maintenant, ma version Xcode est 6.1. Mais j'ai aussi cet avertissement. ça m'énerve beaucoup. après recherche 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 de lignes UILabel sur 1 dans Storyboard. redémarrez votre Xcode. Cela fonctionne pour moi, j'espère que cela pourra aider plus de gens.

Si vous avez vraiment besoin de montrer vos mots plus d'une ligne. vous devriez 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;
4
ronan

Comme je n'ai pas de réputation, Stackoverflow ne me permet pas de commenter la deuxième meilleure réponse. J'ai trouvé un autre truc pour trouver l'étiquette du coupable dans le Storyboard.

Donc, une fois que vous connaissez l'identifiant de l'étiquette, ouvrez votre story-board dans un onglet séparé avec les contrôleurs de vue affichés et il suffit de faire les commandes F et V pour vous diriger directement vers cette étiquette :)

3
Junaid Ahmed

Je l'ai fait fonctionner en sélectionnant la mise en page originale que j'avais dans la sélection W/H. 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 devriez appuyer.

2
AarneHuttunen

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

File inspector in the Xib after changing the iOS Deployment target

Par conséquent, vous devriez le changer manuellement pour chaque Xib Afther the manual change

Une fois cela fait, l'avertissement disparaîtra :-)

1
Gutty1

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

Lors de la suppression d'une étiquette multiligne, aucune contrainte n'est définie pour appliquer la largeur dans la vue parent. C’est là que la nouvelle PreferredMaxWidth entre en jeu. Sur iOS 7 et les versions antérieures, vous devez définir vous-même la largeur maximale. J'ai simplement ajouté une contrainte de 10 pixels à gauche et à droite de l'étiquette.

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

Donc ce n’est pas un bug, il vous suffit de définir vous-même la largeur maximale. L'option explicite mention dans une autre réponse fonctionnera également si 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 (puisque vous avez défini explicitement la largeur).

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

1
Matthew Cawley