UIAlertController 中的 UITextField (border, backgroundColor)
UITextField in UIAlertController (border, backgroundColor)
这里是截图UIAlertController
。我只是在玩自定义字体和 textfield
属性,但无法完成以下操作:
- 清除
UITextField
的背景
- 没有丑陋的边框(黑框)如下图
随着我深入研究代码和 iOS 运行时 headers,我能够修改边框和背景颜色,但上述问题仍然存在,因为这些属性属于容器 UITextView
.将背景更改为 clearColor
没有帮助。
有人玩过这个吗?不确定我是否会使用如此丑陋的文本字段将我的应用程序投入生产。
编辑(2015 年 5 月 13 日) Rory McKinnel 下面的答案已经过 iOS 8 - 8.3 测试,效果很好。结果如下:
这非常 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];
}];
你可以试试这个。
因为您只需要清除警报视图的文本字段的颜色。
只需在创建 alertview 后添加代码行。
UITextField *textField = [alertView textFieldAtIndex:0];
textField.backgroundColor=[UIColor clearColor];
textField.superview.backgroundColor=[UIColor clearColor];
编辑
对于 alertviewController,您可以添加
[alert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
textField.backgroundColor=[UIColor clearColor];
textField.superview.backgroundColor=[UIColor clearColor];
}];
谢谢,如有任何混淆,请回复。
玩得很开心。以下似乎有效。显然,根据要求来判断,它没有未来的证明,距离不工作还有一个补丁。
我通过在调试器中遍历视图层次结构解决了这个问题,我从中注意到了一个 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];
}
}
这里是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()
}
您可以像这样更改边框和背景颜色:
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;
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()
}
}
Swift3清版
alertController.textFields?.forEach {
[=10=].superview?.backgroundColor = .clear
[=10=].superview?.superview?.subviews[0].removeFromSuperview()
}
解决@Rory McKinnel 和@Matthew 中讨论的情况,其中父视图为 NULL 并且地址修改呈现的视图:
extension UIAlertController {
override open func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.textFields?.forEach {
[=10=].superview?.backgroundColor = .color
[=10=].superview?.superview?.subviews[0].removeFromSuperview()
}
}
}
这里是截图UIAlertController
。我只是在玩自定义字体和 textfield
属性,但无法完成以下操作:
- 清除
UITextField
的背景
- 没有丑陋的边框(黑框)如下图
随着我深入研究代码和 iOS 运行时 headers,我能够修改边框和背景颜色,但上述问题仍然存在,因为这些属性属于容器 UITextView
.将背景更改为 clearColor
没有帮助。
有人玩过这个吗?不确定我是否会使用如此丑陋的文本字段将我的应用程序投入生产。
编辑(2015 年 5 月 13 日) Rory McKinnel 下面的答案已经过 iOS 8 - 8.3 测试,效果很好。结果如下:
这非常 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];
}];
你可以试试这个。 因为您只需要清除警报视图的文本字段的颜色。 只需在创建 alertview 后添加代码行。
UITextField *textField = [alertView textFieldAtIndex:0];
textField.backgroundColor=[UIColor clearColor];
textField.superview.backgroundColor=[UIColor clearColor];
编辑 对于 alertviewController,您可以添加
[alert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
textField.backgroundColor=[UIColor clearColor];
textField.superview.backgroundColor=[UIColor clearColor];
}];
谢谢,如有任何混淆,请回复。
玩得很开心。以下似乎有效。显然,根据要求来判断,它没有未来的证明,距离不工作还有一个补丁。
我通过在调试器中遍历视图层次结构解决了这个问题,我从中注意到了一个 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];
}
}
这里是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()
}
您可以像这样更改边框和背景颜色:
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;
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()
}
}
Swift3清版
alertController.textFields?.forEach {
[=10=].superview?.backgroundColor = .clear
[=10=].superview?.superview?.subviews[0].removeFromSuperview()
}
解决@Rory McKinnel 和@Matthew 中讨论的情况,其中父视图为 NULL 并且地址修改呈现的视图:
extension UIAlertController {
override open func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.textFields?.forEach {
[=10=].superview?.backgroundColor = .color
[=10=].superview?.superview?.subviews[0].removeFromSuperview()
}
}
}