2012-08-03 3 views
9

Dopo l'aggiunta di una vista diritto ad un UITextField, mi sto trovando che si rifiuta di visualizzare sia la vista a destra e il tasto CLEAR (avendo entrambi set rightViewMode e clearButtonMode a UITextFieldViewModeAlways). Vedo la vista corretta ma il pulsante Cancella non viene più visualizzato. Mi sono assicurato che non si sovrappongassero con l'overriden clearButtonRectForBounds e clearButtonRectForBounds, inutilmente. E se utilizzo leftView invece di rightView, non si verifica alcun problema e vengono visualizzati sia la vista sinistra che il pulsante di cancellazione.Visualizzazione sia una vista a destra e un pulsante chiaro UITextField

Quindi, anche se non sembra essere indicato nella documentazione, mi sembra che il pulsante di cancellazione sia visualizzato solo quando la vista destra non viene visualizzata (e quando la proprietà text non è una stringa vuota). È corretto e qualcuno ha una soluzione alternativa affidabile? Nel frattempo credo di essere bloccato con la creazione di un UIView che sovrappone la mia vista a destra su un UITextField per ottenere quello che dovrei ottenere da UITextField da solo.

risposta

3

Sì, hai ragione. UITextfield ha proprietà come la vista sinistra e destra. Se si utilizza il pulsante di cancellazione, si sovrappone a destra.

Modulo di Apple doc http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UITextField_Class/Reference/UITextField.html

Se la visualizzazione overlay non si sovrapponga eventuali altre viste di pari livello, che riceve gli eventi touch come qualsiasi altro punto di vista. Se si specifica un controllo per la propria vista, il controllo controlla le tracce e invia le azioni normalmente. Se una vista sovrapposta si sovrappone al pulsante di cancellazione, tuttavia, il pulsante di cancellazione ha sempre la precedenza nella ricezione di eventi. Per impostazione predefinita, la vista sovrapposizione destra si sovrappone al pulsante di cancellazione.

Ma come dice il nome, è una vista. Così puoi creare la tua vista che ha 2 pulsanti su di essa e impostare rightview del campo di testo. Se lo desideri, puoi utilizzare i metodi delegati del campo di testo per far apparire i pulsanti e scomparire dalla vista.

+0

La documentazione sembra fuorviante. Non dice che il pulsante di cancellazione e la vista di destra si escludono a vicenda. Dice solo che si sovrappongono. Questo mi fa sembrare che se usassi una vista trasparente, vedrei il pulsante di cancellazione. Tuttavia non è questo il caso. – Kento

13

non è possibile visualizzare entrambi allo stesso tempo, ma si può fare in questo modo

UITextField * textfield = [[UITextField alloc] initWithFrame:CGRectMake(10, 100, 300, 40)]; 

[textfield setBorderStyle:UITextBorderStyleRoundedRect]; 

UIImageView * imgvw = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"search.jpeg"]]; 

[imgvw setFrame:CGRectMake(0, 0, 30, 30)]; 

[textfield setRightView:imgvw]; 

[textfield setRightViewMode:UITextFieldViewModeUnlessEditing]; 

[textfield setClearButtonMode:UITextFieldViewModeWhileEditing]; 

[self.view addSubview:textfield]; 
+0

Meravigliosa risposta! –

3

ho avuto lo stesso problema, ma è stato facilmente risolto da 'ingannare' l'UITextField ad utilizzare il LeftView invece di RightView. In questo modo puoi utilizzare sia il pulsante di cancellazione che il tuo presunto rightView. Tutto quello che devi fare è sottoclasse UITextField e restituire l'angolo destro in leftViewRectForBounds e aggiornare allo stesso modo editingRectForBounds e textRectForBounds. Funziona perfettamente.

+0

Ho trovato più semplice aggiungere una sottoview e sovrascrivere 'editingRectForBounds/textRectForBounds' per evitarlo. Non ho avuto bisogno di usare 'leftView' (dato che voglio sempre mostrare la mia sottoview.) – zekel

+1

Se si desidera aggiungere un codice di esempio, ti darò un upvote :) – Tim

+0

Funziona bene, ma ho dovuto sovrascrivere 'placeholderRectForBounds' troppo, per farlo funzionare correttamente. – execv

2

sarò il backup risposta s' @strange (utilizzando la visualizzazione a sinistra invece che a destra) con un po' di codice:

-(CGRect)leftViewRectForBounds:(CGRect)bounds 
{ 
    return CGRectOffset([super leftViewRectForBounds:bounds], bounds.size.width - 30, 0); 
} 

-(CGRect)clearButtonRectForBounds:(CGRect)bounds 
{ 
    return CGRectOffset([super clearButtonRectForBounds:bounds], -30, 0); 
} 


-(CGRect)editingRectForBounds:(CGRect)bounds 
{ 
    CGRect rect = bounds; 
    rect.origin.x = 10; 
    rect.size.width -= 60; 
    return rect; 
} 


-(CGRect)textRectForBounds:(CGRect)bounds 
{ 
    CGRect rect = bounds; 
    rect.origin.x = 10; 
    rect.size.width -= 60; 
    return rect; 
} 

Nota che la mia destra (a sinistra) vista la larghezza è di 30.

Se ti capita di usare sia la vista sinistra che quella destra, e il pulsante cancella, quindi questa soluzione ovviamente non funzionerà. In tal caso, dovrai rinunciare a utilizzare uno di questi e utilizzare una vista separata accanto al tuo UITextField.

Problemi correlati