web-dev-qa-db-fra.com

UITextView avec la police personnalisée ne fonctionne pas lorsque le texte est défini sur "attribué"

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!

16
Franck

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. 

8
scott

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.

4
Orion

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!

3
Bilal Ahmad

Vous êtes-vous assuré que "Futura Book BT" est correctement ajouté en tant que police personnalisée dans votre application?

2
freytag

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 :)

1
AngelMixu

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:]

1
Nikola Jovic

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.

0
Nilesh R Patel

Rendre UITextview "sélectionnable" à partir du storyboard fonctionnera.

0
SaRaVaNaN DM

✅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.

0
Fady Lateef