Xcode 6 a une nouvelle fonctionnalité où les polices et les tailles de police dans UILabel
, UITextField
et UIButton
peuvent être réglés automatiquement en fonction de la classe de taille de la configuration actuelle de l' appareil, à droite dans le story - board. Par exemple, vous pouvez définir a UILabel
pour utiliser la taille de police 12 sur les configurations «toute largeur, hauteur compacte» (comme sur les iPhones en mode paysage) et la taille 18 sur les configurations «largeur régulière, hauteur régulière» (comme sur les iPad ). Plus d'informations sont disponibles ici:
developer.apple.com/size_class
Il s'agit d'une fonctionnalité intéressante en théorie, car elle pourrait rendre inutile la définition de différentes polices par programme sur les fonctionnalités de l'interface utilisateur en fonction de la configuration de l'appareil. À l'heure actuelle, j'ai un code conditionnel qui définit les polices en fonction du type d'appareil, mais cela signifie évidemment que je dois définir les polices par programme partout dans l'application. J'étais donc très enthousiasmé au départ par cette fonctionnalité, mais j'ai trouvé qu'elle présentait un grave problème d'utilisation réelle pour moi (peut-être un bogue). Notez que je construis avec le SDK 8 et que je fixe un objectif de déploiement minimum d' iOS 8 , donc cela n'a rien à voir avec la compatibilité avec les anciennes versions d'iOS.
Le problème est le suivant: si je définis des tailles de police différentes pour différentes classes de taille et que j'utilise la police "Système" fournie par iOS , tout fonctionne comme prévu et les tailles de police changent en fonction de la classe de taille. Si j'utilise une police personnalisée fournie par mon application (oui, je l'ai configurée correctement dans mon ensemble d'applications, car elle fonctionne par programme) et que je définis la police personnalisée sur une étiquette dans un storyboard XCode 6 , cela fonctionne également comme prévu. Mais lorsque j'essaie d'utiliser différentes tailles de police personnalisée pour différentes classes de taille, dans le storyboard, cela ne fonctionne soudainement pas. La seule différence de configuration est la police que j'ai choisie (une police personnalisée par rapport à la police système). Au lieu de cela, toutes les polices apparaissent sur lepériphérique et simulateur comme police système par défaut à la taille par défaut , quelle que soit la classe de taille (et j'ai vérifié via le débogueur qu'il remplace la police système par celle spécifiée dans le storyboard). Donc, fondamentalement, la fonctionnalité de classe de taille semble être interrompue pour les polices personnalisées. De plus, il est intéressant de noter que les polices personnalisées s'affichent et ajustent correctement la taille dans le volet "Aperçu" XCode 6 pour le contrôleur de vue: cela ne fonctionne que lorsqu'il est exécuté sur le système iOS réel (ce qui me fait penser que je le configure correctement) .
J'ai essayé plusieurs polices personnalisées différentes, et cela ne semble fonctionner pour aucune d'entre elles, mais cela fonctionne toujours si j'utilise "Système" à la place.
Quoi qu'il en soit, quelqu'un d'autre a-t-il vu ce problème dans Xcode 6 ?
Des idées pour savoir s'il s'agit d'un bogue dans iOS 8, Xcode ou quelque chose du genre
Est-ce que je fais mal?
La seule solution de contournement que j'ai trouvée, comme je l'ai dit, est de continuer à définir les polices par programmation comme je l'ai été pour environ trois versions d'iOS, car cela fonctionne.
Mais j'aimerais pouvoir utiliser cette fonctionnalité si je pouvais la faire fonctionner avec des polices personnalisées. L'utilisation de la police System n'est pas acceptable pour notre conception.
INFORMATIONS SUPPLÉMENTAIRES: Depuis Xcode 8.0, le bogue est corrigé.
Réponses:
Solution rapide:
1) Définir les polices comme système pour les classes de taille
2) Sous-classe UILabel et remplace la méthode "layoutSubviews" comme:
Au fait, c'est une technique très pratique pour les polices iconiques
la source
self.label.font = ...
cette façon, vous pouvez utiliser différentes polices à différents endroits.Après avoir tout essayé, j'ai finalement opté pour une combinaison des solutions ci-dessus. En utilisant Xcode 7.2, Swift 2.
@IBInspectable
vous permet de définir la taille de la police dans le StoryboarddidSet
observateur, pour éviter les pièges delayoutSubviews()
(boucle infinie pour les hauteurs de ligne de vue de table dynamique) etawakeFromNib()
(voir le commentaire de @ cocoaNoob)@IBDesignable
@IBDesignable
ne fonctionne pas avectraitCollection
selon cet autre article de la pileUIScreen.mainScreen()
plutôt queself
par cet article de pilela source
Solution de contournement pour
UILabel
: conservez la même taille de police sur toutes les classes de taille, mais modifiez plutôt la hauteur de votre étiquette en conséquence dans chaque classe de taille. La réduction automatique doit être activée sur votre étiquette. Cela a bien fonctionné dans mon cas.la source
adjustsFontSizeToFitWidth
semble fonctionner uniquement pour la largeur (que je ne peux pas utiliser car le texte des étiquettes est dynamique).Ce bogue (et d'autres liés à Xcode - Size Classes) m'a récemment causé un sérieux chagrin car j'ai dû passer par un énorme fichier de storyboard pour pirater des choses.
Pour toute autre personne occupant ce poste, j'aimerais ajouter quelque chose en plus de la réponse de @ razor28 pour soulager la douleur.
Dans le fichier d'en-tête de votre sous-classe personnalisée, utilisez
IBInspectable
pour vos attributs d'exécution. Cela rendra ces attributs accessibles à partir de l '«Inspecteur d'attributs», visuellement juste au-dessus de la position par défaut des paramètres de police.Exemple d'utilisation:
Cela produira très utilement cette sortie:
Un avantage supplémentaire est que nous n'avons plus à ajouter manuellement les attributs d'exécution pour chaque étiquette. C'est le plus proche que je puisse obtenir du comportement prévu de XCode. Espérons qu'une solution appropriée est en route avec iOS 9 cet été.
la source
Solution similaire à celle de @ razor28 mais je pense qu'un peu plus universelle. En outre, fonctionne très bien sur les anciennes versions iOS
https://gist.github.com/softmaxsg/8a3ce30331f9f07f023e
la source
Le bogue est toujours valide dans XCode 7.0 GM.
La solution de Razor28 provoque des boucles infinies dans certains cas. Mon expérience a été de l'utiliser en conjonction avec SwipeView .
Au lieu de cela, je vous suggère de:
1) Sous-classe UILabel et écraser setFont:
2) Définissez la classe personnalisée de vos UILabels, puis définissez les classes de taille de police à l'aide de la police système
la source
Le problème est toujours là que vous ne pouvez pas utiliser la fonctionnalité pour définir des polices pour différentes classes de taille à partir du générateur d'interface.
Définissez simplement la police en fonction de l'appareil que vous souhaitez, comme ci-dessous:
Cela fonctionne parfaitement sur tous les appareils.
la source
Aucun de ceux-ci n'a fonctionné pour moi, mais cela a fonctionné. Vous devez également utiliser la police système dans IB
la source
Toujours pas de bonne réponse signée. Ce code fonctionne très bien pour moi. Vous devez d'abord désactiver la taille de police pour les classes de taille dans le générateur d'interface. Dans IB, vous pouvez utiliser une police personnalisée.
la source
Une combinaison de certaines des réponses ultérieures ci-dessus a été utile. Voici comment j'ai résolu le bogue IB via une extension Swift UILabel:
la source
J'utilise Swift, XCode 6.4. Alors c'est ce que j'ai fait
Goto Designer -> Identity Inspector -> Définissez la classe sur ExUILabel
Accédez ensuite à l'inspecteur d'attributs dans le concepteur et définissez le nom de la police.
la source
J'ai trouvé une solution encore plus rapide (je suppose que vous utilisez toujours votre police personnalisée).
Créez une catégorie pour UILabel et incluez-la dans les fichiers en utilisant un storyboard buggy avec des classes de taille et des paramètres de police dédiés pour différentes classes:
Utilisez simplement vos polices personnalisées dans le storyboard. Lorsque l'interpréteur bogué utilisera la police système à la place de la vôtre, cette catégorie la basculera vers votre police personnalisée.
la source
J'ai eu le même problème et j'en ai trouvé un pas vraiment clair, mais une bonne solution!
la source
la source