ios - La stringa attribuita con caratteri personalizzati nello storyboard non viene caricata correttamente





swift ios8 xcode6 nsattributedstring (13)


La mia soluzione è un po 'di lavoro. La vera soluzione è che Apple aggiorni Interface Builder.

Con esso è possibile contrassegnare tutto il testo in grassetto e in corsivo nel generatore di interfacce utilizzando un font di sistema, quindi in fase di runtime eseguire il rendering del font personalizzato. Potrebbe non essere ottimale in tutti i casi.

 NSMutableAttributedString* ApplyCustomFont(NSAttributedString *attributedText,
                     UIFont* boldFont,
                     UIFont* italicFont,
                     UIFont* boldItalicFont,
                     UIFont* regularFont)
{

    NSMutableAttributedString *attrib = [[NSMutableAttributedString alloc] initWithAttributedString:attributedText];
    [attrib beginEditing];
    [attrib enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, attrib.length) options:0
                    usingBlock:^(id value, NSRange range, BOOL *stop)
    {
        if (value)
        {
            UIFont *oldFont = (UIFont *)value;
            NSLog(@"%@",oldFont.fontName);

            [attrib removeAttribute:NSFontAttributeName range:range];

            if([oldFont.fontName rangeOfString:@"BoldItalic"].location != NSNotFound && boldItalicFont != nil)
                [attrib addAttribute:NSFontAttributeName value:boldItalicFont range:range];
            else if([oldFont.fontName rangeOfString:@"Italic"].location != NSNotFound && italicFont != nil)
                [attrib addAttribute:NSFontAttributeName value:italicFont range:range];
            else if([oldFont.fontName rangeOfString:@"Bold"].location != NSNotFound && boldFont != nil)
                [attrib addAttribute:NSFontAttributeName value:boldFont range:range];
            else if(regularFont != nil)
                [attrib addAttribute:NSFontAttributeName value:regularFont range:range];
        }
    }];
    [attrib endEditing];

    return attrib;
}

Ispirato da questo post

Utilizziamo font personalizzati nel nostro progetto. Funziona bene in Xcode 5. In Xcode 6, funziona in testo normale, attribuito stringa nel codice. Ma quelle stringhe attribuite impostate nello storyboard tornano tutte su Helvetica quando sono in esecuzione su simulatore o dispositivo, anche se sembrano a posto nello storyboard.

Non sono sicuro se si tratta di un bug di Xcode 6 o iOS 8 SDK, oppure il modo di usare caratteri personalizzati è stato modificato in Xcode 6 / iOS 8?




È possibile aggiungere caratteri personalizzati al libro dei caratteri.

Passaggio 1 : fare clic su Gestisci caratteri. Apre il libro dei caratteri.

Step2 : Clicca su più e aggiungi i tuoi caratteri.

La prossima volta che clicchi su font con testo attribuito, il font appena aggiunto verrà mostrato anche nella lista. Ma assicurati che il tuo carattere personalizzato sia aggiunto in info.plist e raggruppa le risorse.




questa è una soluzione semplice e veloce e questo è il mio caso. quella soluzione è aggiungere una riga di codice in didFinishLaunchingWithOptions func nel file AppDelegate.swift:

per le visualizzazioni di testo :

UITextView.appearance().font = UIFont(name: "IranSans", size: 17)

per etichette :

UILabel.appearance().font = UIFont(name: "IranSans", size: 17)

e per il resto di UiView come questo due ☝️




La risposta più semplice che ha funzionato è quella di trascinare i caratteri in FontBook. Se i font sono nel tuo progetto ma non nel FontBook del tuo computer, IB a volte ha problemi a trovarlo. Strano, ma ha funzionato per me in diverse occasioni.




Lo stesso problema.

Risolto: basta selezionare Selezionabile in TextView. Senza questo ho un font di sistema standard.




La soluzione per me era usare una classe IBDesignable :

import UIKit

@IBDesignable class TIFAttributedLabel: UILabel {

    @IBInspectable var fontSize: CGFloat = 13.0

    @IBInspectable var fontFamily: String = "DIN Light"

    override func awakeFromNib() {
        var attrString = NSMutableAttributedString(attributedString: self.attributedText)
        attrString.addAttribute(NSFontAttributeName, value: UIFont(name: self.fontFamily, size: self.fontSize)!, range: NSMakeRange(0, attrString.length))
        self.attributedText = attrString
    }
}

Dandoti questo in Interface Builder:

Puoi impostare la tua attributionstring esattamente come fai normalmente, ma dovrai impostare fontsize e fontfamily ancora una volta nelle nuove proprietà disponibili.

Poiché Interface Builder funziona con il carattere personalizzato per impostazione predefinita, ciò si traduce in ciò che vedi è ciò che ottieni , che preferisco quando creo le app.

Nota

Il motivo per cui sto usando questo invece della semplice versione è che sto impostando le proprietà sull'etichetta attribuita come la linepaces, che non sono disponibili quando si utilizza lo stile semplice.




In caso di stringa attribuita è possibile aggiungere un font personalizzato nell'elenco dei caratteri come - Fare clic sull'icona del carattere per visualizzare la seguente finestra di dialogo. Nella finestra di dialogo seguente è possibile aggiungere la propria categoria o esistente per il carattere personalizzato. finestra di dialogo dei caratteri attribuita

Dopo aver fatto clic su Gestisci caratteri , apri la seguente finestra di dialogo, seleziona la categoria in quella creata o esistente. Fai clic su + segno per aggiungere il carattere nella categoria. Gestisci il dialogo dei caratteri




Ho incontrato lo stesso problema: il font di attributo impostato per TextView nello storyboard non funzionava in fase di esecuzione con XCode 6.1 e iOS 8 SDK.

Ecco come ho risolto questo problema, potrebbe essere una soluzione per te:

  1. apri l'ispettore attributi della tua vista testo, cambia il testo in "Normale"

  2. clicca sulla croce per cancellare "wC hR" (rosso sotto)

  3. cambia il testo in "Attribuito", quindi puoi impostare il carattere e le dimensioni del testo.

  4. corri a controllare se funziona



Ho incontrato lo stesso problema: il font di attributo per UILabel nello storyboard non funzionava in fase di esecuzione. Usando questo UIFont + IBCustomFonts.m funziona per me IBCustomFonts




Grazie a questo thread, sono arrivato a questa soluzione:

private let fontMapping = [
    "HelveticaNeue-Medium": "ITCAvantGardePro-Md",
    "HelveticaNeue": "ITCAvantGardePro-Bk",
    "HelveticaNeue-Bold": "ITCAvantGardePro-Demi",
]

func switchFontFamily(string: NSAttributedString) -> NSAttributedString {
    var result = NSMutableAttributedString(attributedString: string)
    string.enumerateAttribute(NSFontAttributeName, inRange: NSRange(location: 0, length: string.length), options: nil) { (font, range, _) in
        if let font = font as? UIFont {
            result.removeAttribute(NSFontAttributeName, range: range)
            result.addAttribute(NSFontAttributeName, value: UIFont(name: fontMapping[font.fontName]!, size: font.pointSize)!, range: range)
        }
    }
    return result
}



Ho faticato con questo errore: UILabel viene visualizzato correttamente in IB con un carattere personalizzato ma non viene visualizzato correttamente sul dispositivo o sul simulatore (il font è incluso nel progetto e viene utilizzato in UILabels semplici).

Finalmente trovato Attributed String Creator su (Mac) App Store. Genera codice da inserire nella tua app nel posto appropriato. Fantastico. Io non sono il creatore, solo un utente felice.




Stavo cercando di ottenere celle TableView con testo con più paragrafi. Le stringhe attribuite sembravano essere un modo per ottenere ulteriore spazio tra i paragrafi (qualcosa di un po 'più bello che fare due line-feed nella stringa). È venuto attraverso questo e altri post quando ho scoperto che le impostazioni di IB non si applicavano in fase di esecuzione quando si voleva inserire testo diverso nella cella.

La cosa principale che mi è venuta in mente è stata l'aggiunta di un'estensione a String (usando Swift) per creare una stringa attribuita con determinate caratteristiche. Esempio qui usa il carattere Marker Felt, poiché è facilmente distinguibile da Helvetica. L'esempio mostra anche un piccolo extra di spaziatura tra i paragrafi per renderli più distinti l'uno dall'altro.

extension String {
func toMarkerFelt() -> NSAttributedString {
    var style = NSMutableParagraphStyle()
    style.paragraphSpacing = 5.0
    let markerFontAttributes : [NSObject : AnyObject]? = [
        NSFontAttributeName : UIFont(name: "Marker Felt", size: 14.0)!,
        NSParagraphStyleAttributeName: style,
        NSForegroundColorAttributeName : UIColor.blackColor()
    ]
    let s = NSAttributedString(string: self, attributes: markerFontAttributes)
    return s
    }
}

Quindi, nel mio tableViewCell personalizzato, gli invii il testo che vuoi e lo converte in una stringa attribuita su UILabel.

//  MarkerFeltCell.swift
class MarkerFeltCell: UITableViewCell {
@IBOutlet weak var myLabel: UILabel!
func configureCellWithString(inputString : String) {
    myLabel.attributedText = inputString.toMarkerFelt()
}}

Nella vista controller con tableView, dovresti registrare la tua cella in viewDidLoad () - Ho usato un pennino, quindi qualcosa del tipo:

let cellName = "MarkerFeltCell"
tableView.registerNib(UINib(nibName: cellName, bundle: nil), forCellReuseIdentifier: cellName)

Per fare in modo che la cella calcoli quanto deve essere alto, crea una cella prototipo che viene utilizzata per ottenere informazioni sulle dimensioni e non viene mai aggiunta a TableView. Quindi, nella tua vista le variabili del controller:

var prototypeSummaryCell : MarkerFeltCell? = nil

Quindi in (probabilmente sostituisci - a seconda del controller di visualizzazione) heightForRowAtIndexPath:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        // ...
    if xib == "MarkerFeltCell" {
            if prototypeCell == nil {
                prototypeCell = tableView.dequeueReusableCellWithIdentifier(xib) as? MarkerFeltCell
            }
            let width : CGFloat = tableView.bounds.width
            let height : CGFloat = prototypeCell!.bounds.height
            prototypeCell?.bounds = CGRect(x: 0, y: 0, width: width, height: height)
            configureCell(prototypeCell!, atIndexPath: indexPath)
            prototypeSummaryCell?.layoutIfNeeded()
            let size = prototypeSummaryCell!.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
            let nextHeight : CGFloat = ceil(size.height + 1.0)
            return nextHeight
    } else {  // ...

Nel codice sopra, il prototypeCell sarà riempito la prima volta che è necessario. Il prototypeCell viene quindi utilizzato per calcolare l'altezza della cella dopo aver attraversato il processo di autosizing. Sarà necessario arrotondare l'altezza con la funzione ceil (). Ho anche aggiunto un fattore extra di caramelle.

Il bit di codice finale è il modo in cui si configura il testo per la cella. Per questo esempio, semplicemente:

func configureCell(cell :UITableViewCell, atIndexPath indexPath: NSIndexPath) {
    if let realCell = cell as? MarkerFeltCell  {
        realCell.configureCellWithString("Multi-line string.\nLine 2.\nLine 3.")    // Use \n to separate lines
    }
}

Inoltre, ecco uno scatto del pennino. Appunta l'etichetta ai bordi della cella (con il margine desiderato), ma ha utilizzato un vincolo "Maggiore o uguale a", con una priorità inferiore a "Richiesto" per il vincolo inferiore.

Imposta il carattere dell'etichetta su Attribuito. Il carattere effettivo di IB non ha importanza.

Il risultato in questo caso:




Ho avuto lo stesso problema e ho trovato una soluzione non molto chiara, ma eccellente!

  1. Prima devi impostare la dimensione del carattere richiesta nello storyboard con il nome del font di sistema.
  2. Quindi a questa etichetta si assegna un tag da 100 a 110 (o più, ma 10 è sempre stato sufficiente per me in un controller di visualizzazione).
  3. Quindi inserisci questo codice nel file sorgente del VC e non dimenticare di cambiare il nome del font. Codice in rapido.
override func viewDidLayoutSubviews() {
    for i in 100...110 {
        if let label = view.viewWithTag(i) as? UILabel {
            label.font = UIFont(name: "RotondaC-Bold", size: label.font.pointSize)
        }
    }
}




ios swift ios8 xcode6 nsattributedstring