2016-07-01 1 views
7

Je voulais utiliser la police monospaced de chiffres de SF pour afficher un nombre entier dans un champ de texte en changeant sa police comme suit:UIFont.monospacedDigitSystemFontOfSize() pas vraiment monospace?

textField.font = UIFont.monospacedDigitSystemFontOfSize(textField.font!.pointSize, weight: UIFontWeightSemibold)

Mais si je mets le texte du champ de texte dans une fréquence de 60 Hz, c'est le résultat:

SF monospaced

la largeur du texte est clairement pas constante pour une même quantité de chiffres de sorte qu'il se déplace tout nerveux parce que le champ de texte est contraint de « leader » et « fuite » de l'image en dessous. Pourquoi est-ce le cas et comment y remédier?

Une autre police vraiment monospaced comme « Menlo » se comporte correctement:

Menlo

+0

Même chose arrive aussi à un 'UILabel' contrainte dans sa largeur (avec « ajuster à » activé) –

+0

Vous utilisez Xcode 8 et Swift 3 Je suppose? –

+0

@CodeDifferent Non, Xcode 7.3.1 et Swift 2 –

Répondre

0

Il semble donc que le réglage de la « ajuster à » l'option du champ texte est en remplacant propriété monospaced de la police (même si la vue est assez grand pour contenir le texte!)

Mon solution temporaire à ce stade est de

  • Set textField.adjustsFontSizeToFitWidth-false
  • Définir la police monospaced à nouveau (comme il a été en quelque sorte écrasé par le poseur de adjustsFontSizeToFitWidth)
  • commence à modifier le texte
  • Lorsque vous avez terminé mis textField.adjustsFontSizeToFitWidth à true à nouveau afin de se comporter correctement sur l'utilisateur entrée

Ce n'est pas ce que je voulais à l'origine, mais il fonctionne comme une solution de contournement

enter image description here

+0

@matt Vous n'étiez pas vraiment "celui qui m'a mis dessus", j'ai compris que "ajuster pour s'adapter" change toute la police et non la taille. Mais j'apprécie toujours vos efforts! Notez que ce n'est pas la réponse acceptée, mon problème d'origine est toujours à gauche.Je voulais juste donner une réponse à l'origine du problème et présenter une solution optionnelle. Et j'envisage d'écrire un rapport de bug à Apple –

+2

Il ne t'aurait pas tué pour remettre ma réponse à plus tard. J'ai passé du temps là-dessus; J'ai même fait un projet pour prouver que «ajuster à l'ajustement» était le problème. Les gens n'auront aucune incitation à vous aider si vous ne les récompensez pas. – matt

+0

Je suis désolé, vous avez raison –

1

J'ai un projet qui utilise le « ajuster à » option et si je mets la propriété monospaced utilisant didSet pour la sortie de l'étiquette, il semble fonctionner pour moi dans Xcode 8 Beta 3.

@IBOutlet weak var textLabel: UILabel! { 
    didSet { 
     textLabel = UIFont.monospacedDigitSystemFont(ofSize: textLabel!.pointSize, weight: UIFontWeightRegular) 
    } 
} 
+0

Merci, je vais essayer ça! Mais ne devrait-il pas être "textLabel.font =" et "textLabel! .font! .pointSize"? –

0

Dans mon cas, je définissais la propriété font d'un UILabel à une police numérique monospace et en utilisant attributedText pour définir le texte. Cela a fonctionné dans iOS 9 mais a cassé dans iOS 10. La solution de contournement consiste à définir explicitement l'attribut de police dans la chaîne attribuée.

0

J'ai eu le même problème et ai fait travailler le code. Mise à jour pour Swift 4:

@IBOutlet weak var textLabel: UILabel! { 
    didSet { 
     label.font = UIFont.monospacedDigitSystemFont(ofSize: textLabel!.font!.pointSize, weight: UIFont.Weight.regular) 
    } 
}