【问题标题】:UITextField in UIAlertController (border, backgroundColor)UIAlertController 中的 UITextField(边框、背景颜色)
【发布时间】:2015-05-04 22:16:30
【问题描述】:

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

  • UITextField 的背景清晰
  • 没有丑陋的边框(黑框)如下图

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

有人玩过这个吗?不确定我是否会使用如此丑陋的文本字段将我的应用程序投入生产。

编辑(15 年 5 月 13 日) 以下由 Rory McKinnel 提供的答案已针对 iOS 8 - 8.3 进行了测试,并且运行良好。结果如下:

【问题讨论】:

  • 我想你忘记截图了。
  • 很抱歉。附上截图。
  • 所以[textField setBorderStyle:UITextBorderStyleNone] 什么都没做?
  • 没有。正如我所说,文本字段不是问题,因为它包含在其他一些不响应这些自定义的文本字段中。

标签: ios uitextfield uialertcontroller


【解决方案1】:

玩得很开心。以下似乎有效。显然,从所需的内容来看,它没有未来的证明,并且距离不工作只有一个补丁。

我通过在调试器中遍历视图层次结构发现了这一点,从中我注意到了一个 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];
    }
}

【讨论】:

  • 太棒了!确实如此;它可能会在下一个补丁中中断,但生活就是这样。难的。这正是我一直在寻找的。我自己在这里做了很多修改,但从未想过从视图层次结构中删除视觉效果视图。
  • 不适用于iOS9.1,textField.superview 为NULL。
  • @Matthew Shame,但预计它不会经受住时间的考验。确定你的代码是正确的?没有超级视图的文本是否意味着它不在 UI 中?你的文本字段可以为空吗?
  • @RoryMcKinnel:当时textField还没有添加到superview,所以superview为NULL。在presentViewController完成后它确实可以工作,但是黑色边框的突然消失看起来有点小故障。
  • @Matthew 尝试在调用 presentViewController 之后执行此操作,而不是在完成时执行此操作。在本次电话会议之后,意见应该就位。希望这应该有效。
【解决方案2】:

这里是 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()
}

【讨论】:

  • 谢谢兄弟,我花了 1 小时才找到。
【解决方案3】:

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

 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];

    }];

谢谢,如有困惑请回复。

【讨论】:

  • 对于UIAlertController,这个答案是无关紧要的。
【解决方案4】:

Swift 3 清晰版

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

【讨论】:

    【解决方案5】:

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

        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;
    

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          这很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];
          
          }];
          

          【讨论】:

          • 这似乎不起作用。我想要一个清晰的背景,即背景颜色基本上应该是clearColor。这似乎没有实现。
          • 只要给它警报背景的颜色,它就会显示出来。
          • 我不确定这是这里的要求。我只想要一个背景清晰的文本字段,而不是警报的背景。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-30
          • 2010-12-24
          • 2015-07-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多