2016-07-01 67 views
7

Ho voluto utilizzare font di caratteri a spaziatura fissa di SF per visualizzare un numero intero in un campo di testo cambiando il suo carattere come segue:UIFont.monospacedDigitSystemFontOfSize() non è realmente monospaziato?

textField.font = UIFont.monospacedDigitSystemFontOfSize(textField.font!.pointSize, weight: UIFontWeightSemibold)

Ma se ho impostato il testo del campo di testo in una frequenza di 60 Hz, questo è il risultato:

SF monospaced

la larghezza del testo non è chiaramente costante per una stessa quantità di cifre in modo che si muove tutto agitato perché il campo di testo è costretto a "leader" e "posteriore" di l'immagine sotto. Perché è questo il caso e come risolverlo?

Un altro tipo di carattere veramente a spaziatura fissa come "Menlo" si sta comportando in modo corretto:

Menlo

+0

Stessa cosa avviene anche per un 'UILabel' vincolato nella sua larghezza (con "regolare per adattarsi" abilitato) –

+0

Si utilizza Xcode 8 e Swift 3 presumo? –

+0

@CodeDifferent No, Xcode 7.3.1 e Swift 2 –

risposta

0

Così sembra che l'impostazione del "regolare per adattarsi" l'opzione del campo di testo sovrascrive la proprietà a spaziatura fissa del carattere (anche se la vista è abbastanza grande da contenere il testo!)

mio temporanea soluzione a questo punto è quello di

  • Impostare textField.adjustsFontSizeToFitWidth-false
  • Impostare nuovamente il tipo di carattere a spaziatura fissa (come è stato in qualche modo sovrascritto dal setter di adjustsFontSizeToFitWidth)
  • cominciare a modificare il testo
  • Al termine impostato textField.adjustsFontSizeToFitWidth a true di nuovo al fine di comportarsi correttamente utente ingresso

Questo non è quello che in origine voleva ma funziona come una soluzione

enter image description here

+0

@matt Non eri veramente "colui che mi ha messo su questo", ho capito che "aggiustare per adattarsi" cambia il carattere intero e non le dimensioni. Ma apprezzo molto i tuoi sforzi! Si noti che questa non è la risposta accettata, il mio problema originale è ancora lasciato.Volevo solo dare una risposta a dove il problema deriva e presentare una soluzione opzionale. E sto pensando di scrivere una segnalazione di bug ad Apple –

+2

Non ti avrebbe ucciso per sviare la mia risposta. Ho passato del tempo su questo; Ho anche fatto un intero progetto per dimostrare che "aggiustare per adattarsi" era il problema. Le persone non avranno alcun incentivo ad aiutarti se non le ricompensi. – matt

+0

Mi dispiace, hai ragione –

1

Ho un progetto che utilizza il "regolare per adattarsi" l'opzione e se ho impostato la proprietà spaziatura fissa utilizzando didSet per l'uscita dell'etichetta, sembra funzionare per me in Xcode 8 Beta 3.

@IBOutlet weak var textLabel: UILabel! { 
    didSet { 
     textLabel = UIFont.monospacedDigitSystemFont(ofSize: textLabel!.pointSize, weight: UIFontWeightRegular) 
    } 
} 
+0

Grazie, ci proverò! Ma non dovrebbe essere "textLabel.font =" e "textLabel! .font! .pointSize"? –

0

Nel mio caso, stavo impostando la proprietà font di un UILabel su un carattere a cifra fissa e utilizzando attributedText per impostare il testo. Questo ha funzionato in iOS 9, ma si è rotto in iOS 10. La soluzione alternativa è impostare esplicitamente l'attributo font nella stringa attribuita.

0

Avevo lo stesso problema e ho impostato il codice funzionante. Aggiornato per Swift 4:

@IBOutlet weak var textLabel: UILabel! { 
    didSet { 
     label.font = UIFont.monospacedDigitSystemFont(ofSize: textLabel!.font!.pointSize, weight: UIFont.Weight.regular) 
    } 
} 
Problemi correlati