Swift:如何为UIViewAlertController设置透明背景?

3

在Stack Overflow上有很多关于这个问题的答案,但是似乎都不起作用。那么如何使UIAlertViewController的背景颜色真正透明呢?

我目前所使用的代码是:

let errorAlert = UIAlertController(title: "Title", message: "Message", preferredStyle: UIAlertControllerStyle.Alert)
let subview = errorAlert.view.subviews.first! as UIView
let alertContentView = subview.subviews.first! as UIView
alertContentView.backgroundColor = UIColor.clearColor()
errorAlert.view.backgroundColor = UIColor.clearColor()
showViewController(errorAlert, sender: self)

但结果会在图像上产生一种带有白色色调的透明背景...... 有没有办法去除这种有色背景?

在此输入图片描述


警告控制器中有许多需要更改的子视图。尝试循环遍历所有子视图并更改它们的背景颜色。 - Teja Nandamuri
2个回答

3
为了实现这个目标,所有子视图的颜色都需要设置为 UIColor.clear。此外,所有UIVisualEffectView子视图也需要被移除。可以使用递归函数(Swift 4)来完成这个操作:
func clearBackgroundColor(of view: UIView) {
    if let effectsView = view as? UIVisualEffectView {
        effectsView.removeFromSuperview()
        return
    }

    view.backgroundColor = .clear        
    view.subviews.forEach { (subview) in
        clearBackground(of: subview)
    }
}

在创建UIAlertController实例后立即调用此方法:
let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert)
clearBackgroundColor(of: alert.view)

如果您现在想要改变警告框的外观:

alert.view.layer.backgroundColor = UIColor.red.withAlphaComponent(0.6).cgColor
alert.view.layer.cornerRadius = 5

在整个互联网上,只有这个答案适用于我。谢谢! - Lane Faison

2
你需要访问UIAlertController的父视图。
alertView.view.superview?.backgroundColor = UIColor.clearColor()

此外,UIAlertViewController的子视图也需要透明或清晰,以便背景能够透过来。 - Alex Blair
看起来它正在完全按照我的想法工作。警报视图控制器背景略带绿色(这是它后面的颜色)。你究竟想要实现什么? - Alex Blair
“颜色更清晰”准确无误!;-) 选哪个alpha?现在第一个for循环中的subview.alpha = 0.0会将所有内容都删除! - ajrlewis
换句话说,您已成功使您的警告控制器变得清晰。您现在面临的问题是,您在其后面有一个实心背景,因此您只能实现该颜色的较浅版本。如果您在警报视图后面放置了图像,则会注意到更大的变化,并且它将具有每个人都喜爱的磨砂外观。 - Alex Blair
看起来苹果对此进行了严格的限制。您始终可以使用UIViewController创建自定义警报控制器。您将对此拥有更多控制权。这需要一些额外的时间,但如果您以模态方式呈现它,则会产生相同的效果。 - Alex Blair
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接