2015-05-04 18 views
9

Ecco uno screenshot di UIAlertController. Stavo solo giocando intorno font personalizzati e textfield proprietà, ma non sono riuscito a realizzare il seguente:UITextField in UIAlertController (border, backgroundColor)

  • chiaro sfondo del UITextField
  • non è un brutto bordo (scatola nera) come illustrato di seguito

enter image description here

Mentre mi sono immerso di più nel codice e nelle intestazioni di runtime di iOS, sono riuscito a modificare il colore di sfondo e di sfondo, ma il problema sopra riportato rimane ancora dato che tali proprietà appartengono a un contenitore UITextView. La modifica dello sfondo su clearColor non è di aiuto.

Qualcuno ha mai giocato con questo? Non sono sicuro se porterei mai la mia app in produzione con campi di testo così brutti.

EDIT (13 maggio 15) La risposta in basso di Rory McKinnel è testata per iOS 8 - 8.3 e funziona perfettamente. Il risultato è inferiore:

enter image description here

+0

Penso che hai dimenticato lo screenshot. –

+0

Mi dispiace per quello. Screenshot allegato – p0lAris

+1

Quindi '' '[textField setBorderStyle: UITextBorderStyleNone]' '' non ha fatto nulla? –

risposta

12

Si è divertito con questo. Il seguente sembra funzionare. Ovviamente a giudicare da ciò che è stato richiesto, non ha prove future ed è una patch lontana dal non funzionare.

L'ho capito spostando la gerarchia della vista nel debugger, da cui ho notato un UIVisualEffectView. Rimuovere ciò sembra darti quello che vuoi e impostare la vista contenente su uno sfondo chiaro. Senza rimuovere l'effetto visivo, uno sfondo chiaro mostra cosa c'è dietro la vista di avviso stessa per qualche motivo.

UIAlertController *alertController = 
[UIAlertController alertControllerWithTitle:@"Its Not Pretty!" 
            message:@"Some times things get ugly!"       
           preferredStyle:UIAlertControllerStyleAlert]; 

[alertController addTextFieldWithConfigurationHandler:^(UITextField *textField){ 
    textField.text = @"Text: No border and clear 8^)"; 

}]; 
[self presentViewController:alertController animated:TRUE completion:^{ 
}]; 

for (UIView* textfield in alertController.textfields) { 
    UIView *container = textField.superview; 
    UIView *effectView = container.superview.subviews[0]; 

    if (effectView && [effectView class] == [UIVisualEffectView class]){ 
     container.backgroundColor = [UIColor clearColor]; 
     [effectView removeFromSuperview]; 
    } 
} 
+1

Brillante! È vero; potrebbe solo irrompere nella prossima patch, ma è così che funziona la vita. Difficile. Questo e 'esattamente quello che stavo cercando. Io stesso ho armeggiato molto qui ma non ho mai pensato di rimuovere la vista dell'effetto visivo dalla gerarchia della vista. – p0lAris

+0

Non funziona con iOS9.1, textField.superview è NULL. – Matthew

+0

@ Matthew Shame, non era previsto che durasse la prova del tempo però. Sicuro che il tuo codice sia giusto? un testo senza superview implicherebbe che non è nell'interfaccia utente? cOuld il tuo campo di testo è nullo? –

0

questo è molto hacky, quindi esaminarlo bene prima dell'uso (testato su iOS 8.3):

UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"My Alert" 
                   message:@"This is an alert." 
                 preferredStyle:UIAlertControllerStyleAlert]; 

[alert addTextFieldWithConfigurationHandler:^(UITextField *textField) { 

    textField.placeholder = @"This is my placeholder"; 
    textField.backgroundColor = [UIColor colorWithRed:246.0/255.0 green:246.0/255.0 blue:246.0/255.0 alpha:1.0]; // You can change it to whatever color you want 
    [textField superview].backgroundColor = textField.backgroundColor; 
    [[textField superview] superview].backgroundColor = [UIColor whiteColor]; 

}]; 
+0

Questo non sembra funzionare. Voglio uno sfondo chiaro, cioè il colore dello sfondo dovrebbe essere in pratica 'clearColor'. Questo non sembra realizzarlo. – p0lAris

+0

Basta dargli il colore dello sfondo dell'avviso e lo dimostrerà. – Asaf

+0

Non sono sicuro che sia il requisito qui. Voglio solo un campo di testo che è uno sfondo chiaro, non lo sfondo dell'avviso. – p0lAris

1

si può provare questo. Poiché è necessario solo cancellare il colore nel campo di testo della tua alertview. aggiungi semplicemente linee di codice dopo aver creato la tua alertview.

UITextField *textField = [alertView textFieldAtIndex:0]; 
textField.backgroundColor=[UIColor clearColor]; 
textField.superview.backgroundColor=[UIColor clearColor]; 

EDIT per alertviewCoontroller è possibile aggiungere

[alert addTextFieldWithConfigurationHandler:^(UITextField *textField) { 
     textField.backgroundColor=[UIColor clearColor]; 
     textField.superview.backgroundColor=[UIColor clearColor]; 

    }]; 

Grazie, ripristinare se qualsiasi confusione.

+0

Questa è la risposta è irrilevante quando si tratta di 'UIAlertController'. – n00bProgrammer

+0

@ n00bProgrammer funziona anche con controller uialertview – Kalyani

3

qui è la parte importante nella rapida:

for textfield: UIView in alertController.textfields { 
    var container: UIView = textField.superview 
    var effectView: UIView = container.superview.subviews[0] 
    container.backgroundColor = UIColor.clearColor() 
    effectView.removeFromSuperview() 
} 
0

È possibile modificare il colore del bordo e lo sfondo in questo modo:

let subview = alertController!.view.subviews.first! as UIView 
    let alertContentView = subview.subviews.first! as UIView 
    alertContentView.backgroundColor = UIColor.lightGrayColor() 
    alertContentView.layer.cornerRadius = 10; 
    alertContentView.layer.borderWidth = 2; 
1

Swift 2.0 Versione:

for textField in alert.textFields! { 
    if let container = textField.superview, let effectView = container.superview?.subviews.first where effectView is UIVisualEffectView { 
     container.backgroundColor = UIColor.clearColor() 
     effectView.removeFromSuperview() 
    } 
} 
0

Swift 3 chiaro versione

alertController.textFields?.forEach { 
    $0.superview?.backgroundColor = .clear 
    $0.superview?.superview?.subviews[0].removeFromSuperview() 
} 
Problemi correlati