UIAertField中的UITextField(border,backgroundColor)

时间:2015-05-04 22:16:30

标签: ios uitextfield uialertcontroller

以下是UIAlertController的屏幕截图。我只是在玩自定义字体和textfield属性,但我无法完成以下任务:

  • 明确了UITextField
  • 的背景
  • 没有丑陋的边框(黑框),如下所示

enter image description here

随着我对代码和iOS运行时标题的深入研究,我能够修改边框和背景颜色,但上述问题仍然存在,因为这些属性属于容器UITextView。将背景更改为clearColor并没有帮助。

有没有人玩过这个?不确定我是否会将我的应用程序带到如此丑陋的文本字段的生产中。

编辑(5月13日,15日) Rory McKinnel的下面的答案是针对iOS 8 - 8.3测试的,并且工作得很好。结果如下:

enter image description here

8 个答案:

答案 0 :(得分:17)

对此有一些乐趣。以下似乎有效。显然,根据需要判断,它没有未来的证明,并且是一个远离不工作的补丁。

我通过在调试器中遍历视图层次结构来解决这个问题,我注意到了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];
    }
}

答案 1 :(得分:3)

这是swift中的重要部分:

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

答案 2 :(得分:1)

你可以试试这个。 因为您只需要清晰的颜色到alertview的文本字段。 只需在创建警报视图后添加代码行。

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

EDIT 对于alertviewCoontroller,您可以添加

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

    }];

谢谢,如果有任何混淆,请回复。

答案 3 :(得分:1)

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()
    }
}

答案 4 :(得分:1)

要解决@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()
       }
    }
}

答案 5 :(得分:0)

这非常hacky,所以在使用之前检查它(在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];

}];

答案 6 :(得分:0)

您可以像这样更改边框和背景颜色:

    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;

答案 7 :(得分:0)

Swift 3清晰版

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