UITextField in UIAlertController (border, backgrou

2019-01-11 20:04发布

Here is a screenshot of a UIAlertController. I was just playing around custom fonts and textfield properties but I was unable to accomplish the following:

  • clear background of the UITextField
  • no ugly border (black box) as shown below

enter image description here

As I dived more into the code and iOS runtime headers, I was able to modify border and background color but the above issue still remains as those properties belong to a container UITextView. Changing background to clearColor doesn't help.

Has anybody ever played around with this? Not sure if I would ever take my app into production with such ugly text fields.

EDIT (May 13, 15) The answer below by Rory McKinnel is tested for iOS 8 - 8.3 and works just fine. The result is below:

enter image description here

7条回答
Lonely孤独者°
2楼-- · 2019-01-11 20:11

Swift 3 clear version

alertController.textFields?.forEach {
    $0.superview?.backgroundColor = .clear
    $0.superview?.superview?.subviews[0].removeFromSuperview()
}
查看更多
干净又极端
3楼-- · 2019-01-11 20:12

You can change the border and background color like this:

    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;
查看更多
We Are One
4楼-- · 2019-01-11 20:14

Swift 2.0 version:

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()
    }
}
查看更多
Juvenile、少年°
5楼-- · 2019-01-11 20:15

You can try this. As you need only clear color to textfield of your alertview. simply add lines of code after your alertview is created.

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

EDIT for alertviewCoontroller you can add

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

    }];

Thanks, revert if any confusion.

查看更多
狗以群分
6楼-- · 2019-01-11 20:22

Had some fun with this. The following seems to work. Obviously judging by what was required, it has no future proofing and is a patch away from not working.

I figured this out by walking the view hierarchy in the debugger, from which I noticed a UIVisualEffectView. Removing that seems to give you what you want along with setting the containing view to a clear background. Without removing the visual effect, a clear background shows what is behind the alert view itself for some reason.

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];
    }
}
查看更多
Melony?
7楼-- · 2019-01-11 20:24

This is very hacky, so examine it well before using (tested on 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];

}];
查看更多
登录 后发表回答