2015-01-27 2 views
14

So che per impostare un carattere personalizzato di un elemento sullo schermo, posso semplicemente fare someLabel.font=UIFont(name: "Exo 2.0", size: 15).Utilizzo di caratteri personalizzati per l'intera app iOS swift

Mi chiedevo come si poteva impostarlo per un'intera applicazione usando swift. (Un trucco sarebbe quello di fare quello che so per ogni singolo elemento dell'app ma sarà solo un incubo per la manutenzione)

Vedo che questa domanda è già stata posta con un tag C obiettivo, How to set a custom font for entire iOS app without specifying size ma non sono abbastanza familiarità con Objective-C sufficiente a porta il codice per swift

+0

Si potrebbe scrivere un'estensione 'UILabel' che restituisce il carattere che si desidera al posto della sua proprietà font interna. –

risposta

24

È possibile impostare l'aspetto della UILabel e altre UIViews:

UILabel.appearance().font = UIFont(name: "yourFont", size: yourSize) 

più Generale:

AnyUIView.appearance().font = UIFont(name: "yourFont", size: yourSize) 
+34

la mia domanda è: se lo implemento, anche la dimensione del carattere sarà superata? come evitare questo? –

+2

[this] (http://stackoverflow.com/a/40484460/933770) funziona perfettamente per non sovrascrivere le dimensioni dei caratteri! –

+0

C'è un modo per impostare il carattere globalmente come questo senza specificare la dimensione? In modo che se ho una cella di tabella con stile sottotitoli, il testo verrà comunque visualizzato con le dimensioni predefinite per tali stili, nel mio carattere scelto? –

7

Come una risposta più dettagliata e con questi vantaggi mi consiglia di utilizzare le estensioni:

  • Nessuna dimensione di esclusione (qualunque impostate in designer verrà utilizzata)
  • No sostituzione di stile (grassetto, Facile, Medio, Ultralight è implementato nel mio codice, ma si può personalizzare come avete bisogno)
import UIKit 

extension UILabel { 
    public var substituteFontName : String { 
     get { 
      return self.font.fontName; 
     } 
     set { 
      let fontNameToTest = self.font.fontName.lowercased(); 
      var fontName = newValue; 
      if fontNameToTest.range(of: "bold") != nil { 
       fontName += "-Bold"; 
      } else if fontNameToTest.range(of: "medium") != nil { 
       fontName += "-Medium"; 
      } else if fontNameToTest.range(of: "light") != nil { 
       fontName += "-Light"; 
      } else if fontNameToTest.range(of: "ultralight") != nil { 
       fontName += "-UltraLight"; 
      } 
      self.font = UIFont(name: fontName, size: self.font.pointSize) 
     } 
    } 
} 

extension UITextView { 
    public var substituteFontName : String { 
     get { 
      return self.font?.fontName ?? ""; 
     } 
     set { 
      let fontNameToTest = self.font?.fontName.lowercased() ?? ""; 
      var fontName = newValue; 
      if fontNameToTest.range(of: "bold") != nil { 
       fontName += "-Bold"; 
      } else if fontNameToTest.range(of: "medium") != nil { 
       fontName += "-Medium"; 
      } else if fontNameToTest.range(of: "light") != nil { 
       fontName += "-Light"; 
      } else if fontNameToTest.range(of: "ultralight") != nil { 
       fontName += "-UltraLight"; 
      } 
      self.font = UIFont(name: fontName, size: self.font?.pointSize ?? 17) 
     } 
    } 
} 

extension UITextField { 
    public var substituteFontName : String { 
     get { 
      return self.font?.fontName ?? ""; 
     } 
     set { 
      let fontNameToTest = self.font?.fontName.lowercased() ?? ""; 
      var fontName = newValue; 
      if fontNameToTest.range(of: "bold") != nil { 
       fontName += "-Bold"; 
      } else if fontNameToTest.range(of: "medium") != nil { 
       fontName += "-Medium"; 
      } else if fontNameToTest.range(of: "light") != nil { 
       fontName += "-Light"; 
      } else if fontNameToTest.range(of: "ultralight") != nil { 
       fontName += "-UltraLight"; 
      } 
      self.font = UIFont(name: fontName, size: self.font?.pointSize ?? 17) 
     } 
    } 
} 

campioni per l'utilizzo di estensioni:

ad es. inserisci queste righe nel tuo controller di avvio viewDidLoad

UILabel.appearance().substituteFontName = "IRANSans"; // USE YOUR FONT NAME INSTEAD 
    UITextView.appearance().substituteFontName = "IRANSans"; // USE YOUR FONT NAME INSTEAD 
    UITextField.appearance().substituteFontName = "IRANSans"; // USE YOUR FONT NAME INSTEAD 

P.S. come detto @Christian, è possibile scrivere le proprie estensioni per quasi AnyUIView

+1

Funziona ancora per iOS 11 e swift 4? Ho ottenuto nil per 'self.font.fontName' in' UILabel' – Tj3n

+0

Verificherò e ti farò sapere presto il risultato –

+0

Grazie, si prega di lasciare un commento quando è possibile – Tj3n

0

ho scoperto un modo per fare lo stesso in Swift 4 con iOS 11

solo bisogno di aggiungere @objc parola chiave prima del nome variabile. dichiarazione così variabile sarà così

@objc public var substituteFontName : String { 
    get {} 
    set {} 
} 

Spero che questo aiuti gli altri che si trovano ad affrontare questo problema.