2013-12-18 12 views
19

Ho un UITextField che utilizza il font Museo Sans Rounded 300. Tutto funziona correttamente per i normali campi UIText, ma quando imposti lo secureTextEntry = YES, c'è questa modifica sconcertante delle dimensioni dei proiettili quando l'UITextField ottiene e perde lo stato attivo (cioè diventa e rinuncia, essendo il primo a rispondere).La dimensione dei punti elenco in UITextField con secureTextEntry modifica le dimensioni come interruttori di messa a fuoco quando si utilizza il carattere personalizzato

Quando lo UITextField ha lo stato attivo, i punti elenco sembrano utilizzare il carattere personalizzato, ma una volta che perde lo stato attivo si trasformano in questi proiettili molto più grandi (di dimensioni standard).

+1

Sto vivendo esattamente lo stesso (frustrante) problema. Mi scuso per non essere stato in grado di offrire una soluzione, ma sono sicuro che sarà disponibile. – Luke

+0

Ho appena risposto a questa in un'altra domanda. Controlla la mia risposta qui: http://stackoverflow.com/a/20969693/1578927 – Segev

+0

Penso http://stackoverflow.com/questions/20969451/uitextfield-securetextentry-bullets-with-a-custom-font/20969693# 20969693 è la migliore risposta. Ignora la classe. –

risposta

5

Così, l'unico modo che ho trovato per combattere questo è stato quello di utilizzare i metodi delegato textFieldDidBeginEditing e textFieldDidEndEditing, tenere traccia di ciò che è stato inserito nel campo di testo, sostituirla con una maschera di proiettili, e disabilitare secureTextEntry. Quindi, quando lasciano il campo, in realtà vedono solo il numero giusto di proiettili, piuttosto che il loro testo protetto. È hacky e disordinato, ma lo farà per me, forse anche per te.

+3

Ho creato la categoria su UITextField per risolvere questo problema: github.com/elegion/ELFixSecureTextFieldFont (basato sulla risposta) – glyuck

+0

la categoria mostra ancora due dimensioni ma almeno i punti non sono enormi come prima –

2

Un'altra soluzione:

Mentre questo è un bug di iOS (e di nuovo in iOS 7, devo aggiungere), io ho un altro modo di lavorare intorno ad esso che si potrebbe trovare accettabile. La funzionalità è ancora leggermente degradata ma non di molto.

Fondamentalmente, l'idea è di impostare il carattere sulla famiglia/stile di carattere predefinito ogni volta che il campo ha qualcosa inserito in esso; ma quando non viene inserito nulla, impostalo sul tuo carattere personalizzato. (La dimensione del font può essere lasciata sola, poiché è la famiglia/lo stile, non la dimensione, che è bacata.) Intrappola ogni modifica del valore del campo e imposta il carattere di conseguenza in quel momento. Quindi il debole testo "suggerimento" quando non viene inserito nulla ha il carattere che si desidera (personalizzato); ma quando qualcosa è inserito (che tu stia modificando o meno) userà il default (Helvetica). Dal momento che i proiettili sono pallottole, questo dovrebbe apparire perfetto.

L'unico lato negativo è che i caratteri, mentre si digita prima di essere sostituiti da punti elenco, utilizzeranno il carattere predefinito (Helvetica). Però è solo per una frazione di secondo per personaggio. Se ciò è accettabile, allora questa soluzione funziona.

+0

Questo è il tipo di pensiero laterale che arrivo a StackOverflow per! –

4

Ho trovato una soluzione facile e funziona piuttosto bene. Fondamentalmente è necessario cambiare il carattere in un carattere personalizzato quando si imposta secureTextEntry su yes.

- (void)textFieldDidBeginEditing:(UITextField *)textField{ 

    if([textField.text isEqual:@"Password"]){ 
     textField.text = @""; 
     textField.font = [UIFont fontWithName:@"Helvetica" size:14.5]; 
     textField.secureTextEntry = YES; 
    } 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField{ 

    if([textField.text isEqual:@""]){ 
     textField.text = @"Password"; 
     textField.secureTextEntry = NO; 
     textField.font = [UIFont fontWithName:@"YourFont" size:14.5]; 
    } 
} 
+0

Forse 'systemFontOfSize:' sarebbe meglio di 'fontWithName: size:' quando si imposta il font di sistema –

+0

'systemFontOfSize:' non funzionerebbe in iOS 9. Non so perché ma mostra diverse dimensioni dei proiettili in iOS 9. '[UIFont fontWithName : @ Dimensione "Helvetica": pointSize] 'funziona bene sia per iOS 8 che per 9. – execv

0

Basta creare un metodo che viene richiamato ogni volta che viene selezionata l'opzione Mostra/nascondi password. All'interno del metodo, imposta il carattere su zero, quindi imposta il carattere sul carattere personalizzato e sulla dimensione del carattere. Dovresti impostare anche il carattere e la dimensione personalizzati nel metodo viewWillAppear. All'interno di questo metodo, lo stai ri-impostando.

In questo modo, non è necessario disabilitare secureTextEntry(che potrebbe rendere il vostro campo di testo vulnerabili) e non è necessario utilizzare textFieldDidBeginEditing o textFieldDidEndEditing.

Esempio di codice:

//if the password is obscured and the toggle to show it has been turned on, display password. Else, obscure it. 
- (IBAction)togglePasswordVisibility:(id)sender { 
    // Xcode contains a bug where the font changes to default font if these two lines of code are not included. 
    self.passwordInputTextField.font = nil; 
    self.passwordInputTextField.font = [UIFont fontWithName:@"myCustomFontName" size:myDesiredFontSize]; //set this in viewWillAppear as well! 

    if (self.passwordInputTextField.secureTextEntry == YES) { 
     self.passwordInputTextField.secureTextEntry = NO; 
     [self.showHideButton setTitle:@"HIDE" forState:UIControlStateNormal]; 
    } else { 
     self.passwordInputTextField.secureTextEntry = YES; 
     [self.showHideButton setTitle:@"SHOW" forState:UIControlStateNormal]; 
    } 
} 
1

ho solo risultato del test di cui sopra, la risposta di @Javier Peigneux è la più concisa

#pragma mark -- UITextFieldDelegate 

- (void)textFieldDidBeginEditing:(UCSSafeTF *)safeTF{ 

    safeTF.font = [UIFont fontWithName:@"Helvetica" size:14]; 
} 

- (void)textFieldDidEndEditing:(UCSSafeTF *)safeTF{ 

    safeTF.font = [UIFont fontWithName:@"Helvetica" size:14]; 
} 

Ora scrivo in questo modo, e il risultato è OK. allora il motivo per cui vedi le dimensioni delle pallottole cambiare da piccolo a grande è molto chiaro, solo perché Apple iOS 10 sotto "aiutaci" ci ridimensiona il carattere personalizzato. la speranza ti aiuterà