UITextField в UIAlertController (граница, backgroundColor)

Вот скриншот файла UIAlertController. Я просто играл с пользовательскими шрифтами и textfield свойствами, но не смог сделать следующее:

  • чистый фон UITextField
  • без уродливой границы (черный ящик), как показано ниже

введите описание изображения здесь

По мере того, как я углублялся в код и заголовки среды выполнения iOS, я смог изменить цвет границы и фона, но указанная выше проблема все еще остается, поскольку эти свойства принадлежат контейнеру UITextView. Смена фона на clearColor не помогает.

Кто-нибудь когда-нибудь играл с этим? Не уверен, что когда-нибудь возьму свое приложение в производство с такими уродливыми текстовыми полями.

РЕДАКТИРОВАТЬ (13 мая 15). Ответ Рори МакКиннеля ниже протестирован для iOS 8–8,3 и работает нормально. Результат ниже:

введите описание изображения здесь


person p0lAris    schedule 04.05.2015    source источник
comment
Думаю, вы забыли скриншот.   -  person Daniel Larsson    schedule 05.05.2015
comment
Прости за это. Прикрепленный скриншот.   -  person p0lAris    schedule 05.05.2015
comment
Итак, [textField setBorderStyle:UITextBorderStyleNone] ничего не сделал?   -  person    schedule 08.05.2015
comment
Нет. Как я уже сказал, текстовое поле представляет меньшую проблему, поскольку оно содержится в некоторых других текстовых полях, которые не реагируют на эти настройки.   -  person p0lAris    schedule 11.05.2015


Ответы (8)


Повеселился с этим. Кажется, работает следующее. Очевидно, судя по тому, что требовалось, он не имеет будущих проверок и не работает исправлением.

Я понял это, пройдя иерархию представлений в отладчике, из которого я заметил UIVisualEffectView. Удаление этого, кажется, дает вам то, что вы хотите, вместе с установкой содержащего представления на чистый фон. Не удаляя визуальный эффект, чистый фон показывает, что по какой-то причине скрывается за самим представлением предупреждений.

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];
    }
}
person Rory McKinnel    schedule 13.05.2015
comment
Блестяще! Это правда; он может просто сломаться в следующем патче, но такова жизнь. Жесткий. Это именно то, что я искал. Я сам здесь много повозился, но никогда не думал об удалении представления визуальных эффектов из иерархии представлений. - person p0lAris; 14.05.2015
comment
Не работает с iOS9.1, textField.superview имеет значение NULL. - person Matthew; 29.10.2015
comment
@Matthew: Позор, это не ожидалось, что он выдержит испытание временем. Уверены, что ваш код правильный? текст без супервизора будет означать, что его нет в пользовательском интерфейсе? Может ли ваше текстовое поле быть пустым? - person Rory McKinnel; 30.10.2015
comment
@RoryMcKinnel: textField еще не добавлен в супервизор в то время, поэтому супервизор равен NULL. Он работает после завершения presentViewController, но внезапное исчезновение черной границы выглядит некорректно. - person Matthew; 30.10.2015
comment
@Matthew Попробуйте сделать это после вызова presentViewController, а не в завершении. После настоящего звонка взгляды должны быть на своих местах. Надеюсь, это сработает. - person Rory McKinnel; 30.10.2015

вот важная часть быстрого:

for textfield: UIView in alertController.textfields {
   var container: UIView = textField.superview
   var effectView: UIView = container.superview.subviews[0]
   container.backgroundColor = UIColor.clearColor()
   effectView.removeFromSuperview()
}
person Paul Lehn    schedule 25.03.2016
comment
Спасибо, братан, это заняло у меня 1 час, чтобы найти. - person truthsayer; 19.08.2019

Вы можете попробовать это. Поскольку вам нужен только чистый цвет текстового поля вашего предупреждения. просто добавьте строки кода после создания вашего предупреждения.

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

РЕДАКТИРОВАТЬ для alertviewCoontroller, который вы можете добавить

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

    }];

Спасибо, вернитесь, если возникнет путаница.

person Kalyani    schedule 13.05.2015
comment
Этот ответ не имеет отношения к UIAlertController. - person n00bProgrammer; 13.05.2015

Чистая версия Swift 3

alertController.textFields?.forEach {
    $0.superview?.backgroundColor = .clear
    $0.superview?.superview?.subviews[0].removeFromSuperview()
}
person zombie    schedule 16.05.2017

Вы можете изменить цвет границы и фона следующим образом:

    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;
person R Thomas    schedule 21.07.2016

Версия Swift 2.0:

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()
    }
}
person Mark Bourke    schedule 27.07.2016

Чтобы разрешить ситуацию, описанную в @Rory McKinnel и @Matthew, где супервизор имеет значение NULL и адрес изменяет представленное представление:

extension UIAlertController {
    override open func viewWillAppear(_ animated: Bool) {
       super.viewWillAppear(animated)
       self.textFields?.forEach {
           $0.superview?.backgroundColor = .color
           $0.superview?.superview?.subviews[0].removeFromSuperview()
       }
    }
}
person Matt    schedule 05.08.2020

Это очень хакерский метод, поэтому внимательно изучите его перед использованием (проверено на 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];

}];
person Asaf    schedule 11.05.2015
comment
Похоже, это не работает. Мне нужен чистый фон, т.е. цвет фона должен быть в основном clearColor. Похоже, этого не достигается. - person p0lAris; 13.05.2015
comment
Просто дайте ему цвет фона предупреждения, и он продемонстрирует. - person Asaf; 13.05.2015
comment
Я не уверен, что это требование здесь. Я просто хочу, чтобы текстовое поле было четким фоном, а не фоном предупреждения. - person p0lAris; 13.05.2015