2016-11-28 124 views
0

我正在实现自定义警报,为背景设置颜色。下面的代码当我在模拟器中挤压时完美地工作,但是当我在iPhone上测试时,自定义背景被叠加在如下所示的模式中。Swift UIAlertController背景颜色

let alertController = UIAlertController(title: "Opções", message: "Deseja realmente excluir esse serviço?", preferredStyle: .Alert) 
alertController.setValue(NSAttributedString(string: "Opções", attributes: [NSFontAttributeName : UIFont.systemFontOfSize(17),NSForegroundColorAttributeName : UIColor.whiteColor()]), forKey: "attributedTitle") 
alertController.setValue(NSAttributedString(string: "Deseja realmente excluir esse serviço?", attributes: [NSFontAttributeName : UIFont.systemFontOfSize(17),NSForegroundColorAttributeName : UIColor.whiteColor()]), forKey: "attributedMessage") 

alertController.view.tintColor = UIColor.whiteColor() 
let backView = alertController.view.subviews.last?.subviews.last 
backView?.layer.cornerRadius = 5.0 
backView?.backgroundColor = corAzul 
backView?.alpha = 1.0 
let imageView = UIImageView(frame: CGRectMake(10, 15, 30, 30)) 
imageView.image = UIImage(named: "load") 
alertController.view.addSubview(imageView) 

let Action2 = UIAlertAction(title: "Excluir", style: .Default) { (action) in 
    Excluir() 
} 
let Action7 = UIAlertAction(title: "Cancelar", style: .Cancel) { (action) in 
    Cancelar() 
} 
alertController.addAction(Action2) 
alertController.addAction(Action7) 
viewController.presentViewController(alertController, animated: true) {} 

enter image description here

这是什么原因?我该如何解决它?

回答

0

我发现了一个解决方案,我并不为此感到骄傲,因为它不够优雅,与众不同,但它起作用! 很明显,iOS中的子视图数量在10之前导致1的时候用“cont”选中,那么.last或者.fist都可以工作,但是在iOS 10中这个数字与1不同,我无法确定它是否会保持不变,但我决定做一个“换来”做出所有可能性。

alertController.view.tintColor = UIColor.whiteColor() 
for i in 0 ..< alertController.view.subviews.count { 
    alertController.view.subviews[i].backgroundColor = corAzul 
    alertController.view.subviews[i].layer.cornerRadius = 5.0 
    alertController.view.subviews[i].alpha = 1.0 
    for ii in 0 ..< alertController.view.subviews[i].subviews.count { 
     alertController.view.subviews[i].subviews[ii].backgroundColor = corAzul 
     alertController.view.subviews[i].subviews[ii].layer.cornerRadius = 5.0 
     alertController.view.subviews[i].subviews[ii].alpha = 1.0 
     for iii in 0 ..< alertController.view.subviews[i].subviews[ii].subviews.count { 
      alertController.view.subviews[i].subviews[ii].subviews[iii].backgroundColor = corAzul 
      alertController.view.subviews[i].subviews[ii].subviews[iii].layer.cornerRadius = 5.0 
      alertController.view.subviews[i].subviews[ii].subviews[iii].alpha = 1.0 

     } 
    } 

} 

我知道这并不漂亮,但它是唯一的解决方案! 如果有人发现更复杂的东西,请随时投稿

+0

在我看来,更好的是不要使用UIAlertController。制作你自己的类似警报的视图控制器很容易。 – matt

+0

我在某些情况下完成了这项工作,但我的项目中有几个应用程序用于处理行动警报。我们很难做到完全可以配置的东西,并且可以替代任何 –

+0

明白的项目。但是自定义UIAlertController视图不受支持,并且(如您所见)很脆弱。 – matt

1

如果要更改背景颜色,请尝试更改alertController.view.subviews.first?.subviews.first?.subviews.last?.backgroundColor。但它仍然有一个白色的封面。 UIAlertViewController的视图层次结构不是那么简单。您不知道它是否是影响封面颜色的图层或视图。 您尝试更改UIAlertController的背景颜色。但我认为这不是一个好主意。我们不知道UIAlertController的iOS8和iOS9的区别。也许alertController.view.subviews.first?.subviews.first?.subviews.last?.backgroundColor适用于iOS10,并且不适用于以前的某些版本。你想改变的东西的API不是开放给我们的,它可能会随意改变。如果你想有一个自定义UIAlertViewController,尝试做一个全新的。

+0

如何正确创建新警报? @季亨达 –

+0

@AthilaZuma sry,我的意思是使用'UIViewController'来构建你的自定义警报视图控制器。 –

+0

你能否给我提供一个例子或参考开始? @季亨达 –