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?
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:
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".
Pour rechercher les étiquettes de problème dans un grand scénarimage, suivez les étapes ci-dessous.
Ensuite, révélez votre storyboard en tant que fichier source.
Chercher. Vous devriez être capable de dire facilement de quelle étiquette il s'agit d'ici en regardant le contenu.
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.
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.
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?
Solution c'est assez simple
Activez simplement les versions pour iOS 8 et versions ultérieures
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.
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;
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 :)
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.
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.
Par conséquent, vous devriez le changer manuellement pour chaque Xib
Une fois cela fait, l'avertissement disparaîtra :-)
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.