我在How to change the background color of the UIAlertController?中找到以下代码来更改UIAlertView
的背景颜色:
let subview = dialog.view.subviews.first! as UIView
let alertContentView = subview.subviews.first! as UIView
subview.subviews.top!
alertContentView.backgroundColor = UIColor.whiteColor()
但是,它会更改整个视图的背景颜色。如何仅更改标题的背景颜色?
答案 0 :(得分:1)
试试这个:
// Construct the MqttClient instance
MqttClient client = new MqttClient(brokerUrl, clientId);
// Set this wrapper as the callback handler
client.setCallback(this);
// Connect to the server
client.connect();
// Disconnect the client
client.disconnect();
答案 1 :(得分:1)
尝试跟随它的作品。
let confirmAlert = UIAlertController(title: "Application Name", message: "This is demo message.", preferredStyle: .Alert)
let attributedString = NSAttributedString(string: "Application Name", attributes: [
NSFontAttributeName : UIFont.systemFontOfSize(13),
NSForegroundColorAttributeName : UIColor.greenColor()
])
let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
confirmAlert.addAction(defaultAction)
confirmAlert.setValue(attributedString, forKey: "attributedTitle")
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(confirmAlert, animated: true, completion: nil)
答案 2 :(得分:0)
Sample project - >包含最新代码
第一步:
找到具有正确框架的子视图!
这个小函数将返回所有嵌套子视图的框架和地址。
我们正在寻找一个高度小于UIAlertController
并且Origin
为0,0
的子视图。
我的alertController的高度为128
func subViewStack(view:UIView, levels: [Int]) {
var currentLevels = levels
currentLevels.append(0)
for i in 0..<view.subviews.count {
currentLevels[currentLevels.count - 1] = i
let subView = view.subviews[i]
print(subView.frame, "depth:", currentLevels)
subViewStack(subView, levels: currentLevels)
}
}
这会打印出这样的内容:
(0.0, 0.0, 270.0, 128.0) depth: [0, 0]
//frame - firstsubview - firstsubview
这可能是一个很好的候选人:
(0.0, 0.0, 270.0, 84.0) depth: [0, 1, 0, 0]
//frame - firstsubview - secondsubiew - firstsubview - firstsubview
这转化为:
print(alertController.view.subviews[0].subviews[1].subviews[0].subviews[0].frame)
// prints (0.0, 0.0, 270.0, 84.0) -> Bingo!
第二步:
将该子视图着色!
alertController.view.subviews[0].subviews[1].subviews[0].subviews[0].backgroundColor = UIColor.redColor()
如果在显示alertController之前设置颜色,它将崩溃。 在completionHandler中设置它。
presentViewController(alertController, animated: true) { () -> Void in
self.subViewStack(alertController.view, levels: [])
print(alertController.view.subviews[0].subviews[1].subviews[0].subviews[0].frame)
alertController.view.subviews[0].subviews[1].subviews[0].subviews[0].backgroundColor = UIColor.redColor()
}
第三步:
让它安全! 如果他们将任何内容更改为堆栈,这将阻止您的应用程序崩溃。您的视图可能没有颜色,但崩溃更糟。
扩展UIView,以便能够使用我们之前打印的地址之一获取子视图。使用guard
或if let
可防止访问不存在的子视图。
extension UIView {
// use the printed addresses to access the views. This is safe even if the UIView changes in an update.
func getSubView(withAddress address:[Int]) -> UIView? {
var currentView : UIView = self
for index in address {
guard currentView.subviews.count > index else {
return nil
}
currentView = currentView.subviews[index]
}
return currentView
}
}
第四步:
由于不允许继承UIAlertController
,我们可能会尝试扩展它。这样您就无法访问viewDidAppear
,因此您无法显示UIAlertController
动画。
protocol CustomAlert {
var view : UIView! { get }
}
extension CustomAlert {
func titleBackgroundColor(color:UIColor) {
if view == nil {
return
}
if let titleBackground = view.getSubView(withAddress: [0, 1, 0, 0]) {
titleBackground.backgroundColor = color
}
}
}
extension UIAlertController : CustomAlert {
}
这为您提供了查找您可能想要更改的任何子视图的方法,以及为该类添加自定义函数的方法。没有子类化。
在titleBackgroundColor
的completionHandler中调用presentViewController
来设置颜色。