2015-06-24 21 views
10

Ho impostato un UITextView e un UILabel per utilizzare un carattere personalizzato. (È un font mongolo specchiato verticalmente, ma ho anche incluso il testo inglese per poter vedere l'effetto.) Le parole vengono visualizzate in Interface Builder, ma nel simulatore la maggior parte dei caratteri nello UITextView sono solo caselle vuote. Stranamente, i caratteri nello UILabel vengono visualizzati correttamente nel simulatore.Caratteri personalizzati visualizzati in IB ma non nel simulatore

Come è possibile visualizzarli anche nello UITextView?

enter image description here

Note:

  • Sto usando Xcode versione 6.3.2. Da this SO Q&A So che i caratteri personalizzati dovrebbero funzionare con Xcode 6 in IB.
  • Ho aggiunto il mio file di font al progetto e l'ho selezionato dall'elenco dei caratteri personalizzati sia per lo UITextView che per lo UILabel.
  • Ho aggiunto la chiave "Caratteri forniti dall'applicazione" nel mio progetto Info.plist e aggiunto il mio carattere personalizzato. enter image description here
  • This question è molto simile (ma è diverso perché non menziona il problema UITextView e UILabel). Al momento di questa stesura, l'OP per quella domanda non ha indicato se la risposta votata in alto ha aiutato o meno. Ho eseguito il codice in that answer per confermare che il mio carattere è davvero nel pacchetto. Ho ottenuto il seguente risultato, che conferma che è nel pacchetto, in modo che ancora non risolva il mio problema.

    Family : ChimeeWhiteMirrored 
        Font : ChimeeWhiteMirrored 
    

Qualcuno vedere il mio errore o avete altre idee?

Aggiornamento

Dopo aver ricevuto la downvote @ di darkheartfelt e comment alla mia risposta qui sotto, ho ricreato il mio problema originale pensando che forse avevo perso qualcosa. Anche se in iOS 9 il font appare in modo leggermente diverso nel simulatore, il problema di base è ancora lì: sembra ok in IB ma non nel simulatore.

enter image description here

Il problema può essere riprodotto (usando Xcode 7.1.1) come segue:

  1. Avviare un nuovo singolo progetto vista.
  2. Aggiungere il tipo di carattere per il progetto (può essere scaricato da here progetto github correlata)
  3. Nel file Info.plist aggiungere "font mediante l'applicazione" con il nome del font "ChimeeWhiteMirrored.ttf".
  4. Verificare che le "Risorse pacchetto di copia" del target contengano ChimeeWhiteMirrored.ttf.
  5. Aggiungere uno UITextView allo storyboard.
  6. Nel IB Attributi pasta ispettore nel seguente testo: 1-10:           one two three four five six seven eight nine ten
  7. Nel IB Attributi impostare il carattere su Custom e la famiglia a ChimeeWhiteMirrored.

Questo riproduce il problema per i caratteri speciali e come descritto nella mia risposta di seguito, l'unica cosa che ho trovato per risolvere questo problema è impostare il carattere in codice.

import UIKit 
class ViewController: UIViewController { 

    @IBOutlet weak var textView: UITextView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // set custom font 
     textView.font = UIFont(name: "ChimeeWhiteMirrored", size: (textView.font?.pointSize)!) 
    } 
} 

Se mi sbaglio o manca qualcosa, per favore fatemelo sapere. Fino ad allora dovrò continuare ad usare la mia risposta accettata di seguito.

+0

La mia soluzione per questo: http://stackoverflow.com/a/40339276/3360896 –

+1

Questo è il ** PERFECT WALKTHROUGH ** per questo problema: http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/ – Fattie

+0

Non c'è dubbio che l'attuale iOS/Xcode (2017) è bacato. ** A volte devi includere il nome del file del font nel tuo plist **, a volte non devi. È un bug – Fattie

risposta

24

Sembra che, mentre quando ho importato il tipo di carattere nel mio progetto ho selezionato "Aggiungi a bersaglio appartenenza", dopo aver ispezionato il tipo di carattere, si era non aggiunto all'obiettivo! Ha funzionato bene in Interface Builder, ma non ha funzionato nella simulazione o quando è stato compilato.

Selezione del file di carattere nella visualizzazione cartella del progetto e selezionando la casella appartenenza bersaglio fisso è:

+0

Segnalo come risposta accettata a causa del voto popolare. – Suragch

1

creare 2 classi categoria

-------UILabel+ChimeeWhiteMirrored.h-------------- 

#import <UIKit/UIKit.h> 

@interface UILabel (ChimeeWhiteMirrored) 
@property (nonatomic, copy) NSString* fontNamelight; 
@property (nonatomic, copy) NSString* fontNamebold; 
@property (nonatomic, copy) NSString* fontNameboldIltalic; 
@property (nonatomic, copy) NSString* fontNameRegular; 
@end 

-------------------------------------------- 
-------UILabel+ChimeeWhiteMirrored.m-------------- 

#import "UILabel+ChimeeWhiteMirrored.h" 

@implementation UILabel (ChimeeWhiteMirrored) 


- (NSString *)fontNamelight { 
    return self.font.fontName; 
} 
- (NSString *)fontNamebold { 
    return self.font.fontName; 
} 
- (NSString *)fontNameRegular { 
    return self.font.fontName; 
} 

- (NSString *)fontNameboldIltalic { 
    return self.font.fontName; 
} 



- (void)setFontNameRegular:(NSString *)fontName { 
    self.font = [UIFont fontWithName:fontName size:self.font.pointSize]; 
} 

- (void)setFontNamelight:(NSString *)fontName { 
    self.font = [UIFont fontWithName:fontName size:self.font.pointSize]; 
} 

- (void)setFontNamebold:(NSString *)fontName { 
    self.font = [UIFont fontWithName:fontName size:self.font.pointSize]; 
} 

- (void)setFontNameboldIltalic:(NSString *)fontName { 
    self.font = [UIFont fontWithName:fontName size:self.font.pointSize]; 
} 




@end 

-------------------------------------------- 

e aggiungere il file TTF nella cartella codice del progetto di aggiungere direttamente il nome del file TTF per etichettare dalle proprietà.

enter image description here

+0

Ti capita di conoscere la versione Swift? In caso contrario, nessun problema, ma non ho molta familiarità con l'obiettivo C, quindi potrebbe volerci un po 'prima che io possa capire come farlo in Swift e farti sapere se risolve il problema. – Suragch

+0

Puoi per favore creare un'estensione. https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html –

+0

Grazie per la risposta. [Ho imparato molto] (http://stackoverflow.com/a/31026358/3681880) studiandolo e anche se non ho finito per usarlo esattamente, era la chiave per trovare la risposta. +1 – Suragch

1

Common Mistakes With Adding Custom Fonts to Your iOS App è una lista di controllo utile per ottenere font personalizzati per visualizzare correttamente. Tuttavia, nessuna di queste cose ha funzionato in questa particolare situazione.

Oltre alle cose che hai fatto nelle note, devi anche impostare il carattere in codice. Ci sono alcune opzioni per farlo.

Opzione 1: hardcode direttamente

Questo è semplice come fare il seguente:

myUITextView.font = UIFont(name: "ChimeeWhiteMirrored", size: myUITextView.font.pointSize) 

Nota che il nome è il nome del font, non il nome del file del font (ChimeeWhiteMirrored.ttf).

Opzione 2: Runtime definito dall'utente Attributi

Se si vuole evitare di farlo in codice, è possibile farlo con il User Defined Runtime Attributes. Grazie a @SandeepAgrawal per questa idea. Per favore, invertire la sua risposta. La versione Swift che ha funzionato per me è stato

import UIKit 

extension UITextView { 

    public var myFontName: String { 
     get { 
      return self.font.fontName 
     } 
     set { 
      self.font = UIFont(name: newValue, size: self.font.pointSize) 
     } 
    } 
} 

quindi aggiungere il percorso chiave, il tipo e il valore nella finestra di ispezione identità della vista, come è mostrato nella figura seguente.

enter image description here

Opzione 3: IBInspectable

From what I have read, utilizzando l'attributi utente Runtime Definito è il modo di programmi di farlo. L'utilizzo di IBInspectable (e IBDesignable) consente di apportare le modifiche in Interface Builder e vedere subito le modifiche.

+1

"devi anche impostare il carattere nel codice." <--- questo NON è assolutamente vero. Aggiungi il carattere al progetto, aggiungilo come elemento di stringa all'interno dell'array "Caratteri forniti dall'applicazione" nel tuo info.plist e infine aggiungilo alle "Risorse del pacchetto di copia" del target. Quindi dovrebbe apparire in IB, Storyboard e, soprattutto, nella tua app. – darkheartfelt

+1

@darkheartfelt, avevo fatto tutte quelle cose. Sono stato in grado di visualizzare il carattere personalizzato in IB e nello storyboard ma non nell'app. Ho rifatto di nuovo l'intero esempio solo per testarlo. Puoi vedere il mio aggiornamento e la risposta al tuo commento nella domanda originale sopra. – Suragch

+0

"Copy Bundle Resources" è la chiave –

Problemi correlati