J'ai une UITextView
avec du texte provenant d'un .rtf (collé directement sur Xcode)
Le contexte ne contient qu'une seule police personnalisée (Futura Book BT 11.0)
Si je règle la propriété "text (attribuée)" à "plain" = La police personnalisée apparaît correctement à partir du storyboard et de l'application
Si je mets la propriété "text" à "attribué" =. La police personnalisée apparaît correctement à partir du storyboard MAIS pas à partir de l'application.
Comme mon objectif était d’avoir un texte avec plusieurs polices, comment avoir la propriété attribuée pour travailler avec des polices personnalisées? (Rapide)
Merci!
La police personnalisée apparaît correctement à partir du storyboard MAIS pas à partir de l'application.
L'application n'apparaît-elle pas du tout ou est-elle restaurée dans la police système? Si cela revient à Helvetica, il s’agit peut-être d’un bogue connu dans iOS 8.1 http://openradar.appspot.com/radar?id=5117089870249984
Solution possible: L'avez-vous testé sur le simulateur et sur un appareil? Il se peut que cela ne fonctionne tout simplement pas sur le simulateur, ce qui signifie que vous pourriez le réparer en installant la police sur votre système.
Ce que je fais:
private var _mutableString: NSMutableAttributedString!
if !isTitle {
var titleFont: UIFont = UIFont(name: StyleGlobals.TitleFontName, size: StyleGlobals.TitleFontSize)!
self._mutableString.addAttribute(NSFontAttributeName, value: titleFont, range: NSMakeRange(0, count(self._mutableString.string)))
self._mutableString.addAttribute(NSForegroundColorAttributeName, value: StyleGlobals.FontColor, range: NSMakeRange(0, count(self._mutableString.string)))
}
self.Label.attributedText = self._mutableString
Cela s'applique à la fois à une nouvelle couleur de police et à la police elle-même. J'ai un certain UILabel qui doit pouvoir contenir différentes polices. Il peut s'agir d'un titre ou d'un sous-titre. Par conséquent, je devais appliquer la police lorsque j'avais déterminé le contenu de l'étiquette.
J'ai rencontré le même problème lorsque j'ai utilisé plusieurs polices personnalisées dans UILabel. Le scénarimage montre un résultat correct, mais l'appareil ne le fait pas !!
Ce que j'ai découvert que si la taille de la police est différente du texte avec des polices personnalisées différentes. Ça fonctionne bien!!
Donc, pour l'instant, j'utilise une taille de police légèrement différente. Par exemple, si l’un a 14 ans, j’ai utilisé 14.01 pour l’autre. Ce n'est pas possible à l'intérieur du storyboard, alors j'ai ouvert le storyboard en tant que code source et défini manuellement la taille de la police comme suit:
<attributedString key="attributedTitle">
<fragment content="Do not have account? ">
<attributes>
<color key="NSColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
<font key="NSFont" size="14" name="Roboto-Light"/>
<paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
<fragment content="Login">
<attributes>
<color key="NSColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
<font key="NSFont" size="14.01" name="Roboto-Bold"/>
<paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
<attributedString key="attributedTitle">
Mais je suis toujours incapable de trouver pourquoi cela se produit!
Vous êtes-vous assuré que "Futura Book BT" est correctement ajouté en tant que police personnalisée dans votre application?
Dans mon cas, le problème était que je n'avais pas la police installée sur mon système, je l'ai donc fait avec Font Book. Ensuite, la police est apparue sur la liste dans des étiquettes de texte attribuées.
EDIT: Maintenant, j'ai eu quelques problèmes pour afficher mon texte actuel et je l'ai fait (j'utilise un UILabel, non testé sur UITextView):
Ma solution est de créer une chaîne attribuée à partir de HTML (vu cette extension quelque part ici dans SO):
extension String {
var html2AttStr: NSAttributedString? {
guard let data = dataUsingEncoding(NSUTF8StringEncoding) else { return nil }
do {
return try NSAttributedString(data: data,
options: [
NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding],
documentAttributes: nil)
} catch let error as NSError {
//print(error.code)
return nil
}
}
}
Et puis ce que je fais est quelque chose comme:
let htmlStyle = "<meta charset=\"UTF-8\"><style> body { font-family: 'SourceSansPro-Light'; font-size: 18px; text-align: center; } b {font-family: 'SourceSansPro-Light'; }</style>"
let myString = "<font size=\"+2\">Slightly bigger font</font><br><br>Some message with normal text <b>a bold text</b> and some more text"
var attributedString = htmlStyle
attributedString.appendContentsOf(myString)
informationLabel.attributedText = attributedString.html2AttStr
L'un des avantages est que je peux maintenant insérer du texte '% s' dans la chaîne pour l'analyse avec un mot/nombre/etc. et il est plus facile de traduire et d’analyser. Avec du texte formaté, je devais créer un tas de codes pour trouver du texte, appliquer le format sans toucher à rien. Cela fonctionne plutôt bien pour moi :)
Veuillez appeler tout votre code dans viewDidLayoutSubviews method! Than fonctionne. J'ai de nombreux problèmes à modifier la taille de la police, le style i, les méthodes viewDidLoad ou viewWillApperar.
Il suffit donc de déplacer votre code dans viewDidLayoutSubviews method. Vous pouvez utiliser flag pour changer les polices une seule fois car cette méthode peut être appelée plusieurs fois:]
Vous pouvez utiliser cette extension
extension NSMutableAttributedString {
func createAttributedString(Word : NSArray, attributeCustomizeFont:UIFont, defaultFont : UIFont, defaultColor : UIColor, allowSpecing : Bool , allowUnderLine : Bool = false) -> NSAttributedString {
self.addAttribute(NSAttributedString.Key.font, value: defaultFont, range: (self.string as NSString).range(of: self.string))
if allowSpecing {
self.addAttribute(NSAttributedString.Key.kern, value: NSNumber(value: 5), range: (self.string as NSString).range(of: self.string))
}else {
self.addAttribute(NSAttributedString.Key.kern, value: NSNumber(value: 0), range: (self.string as NSString).range(of: self.string))
}
self.addAttribute(NSAttributedString.Key.foregroundColor, value: defaultColor, range: (self.string as NSString).range(of: self.string))
for i in 0..<Word.count {
self.addAttribute(NSAttributedString.Key.font, value: attributeCustomizeFont, range: (self.string as NSString).range(of: Word.object(at: i) as! String))
}
if allowUnderLine {
self.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: (self.string as NSString).range(of: self.string))
}
return self
}
}
Comment utiliser l'extension
var attributedString = NSMutableAttributedString(string:"Test for set custom font")
attributedString = attributedString.createAttributedString(Word: ["custom font"], attributeCustomizeFont: UIFont(name: "Arial", size: 18)! , defaultFont: UIFont(name: "Helvetica", size: 15)!, defaultColor: UIColor.black, allowSpecing: false) as! NSMutableAttributedString
Ainsi, le jeu de polices entier "Helvetica" de taille 18 et pour " police personnalisée" texte défini de police "Arial" de taille 15.
Rendre UITextview "sélectionnable" à partir du storyboard fonctionnera.
✅FIXED:
Corrigé en sous-classant ma UITextView
en KMPlaceholderTextView , qui est également utile pour ajouter un espace réservé à la vue texte et peut être utilisé à partir d'Interface Builder comme identique à UITextField
.
Maintenant, je peux utiliser des polices personnalisées avec succès et ajouter du texte de substitution.