在UIAlertController中更改标题的背景颜色(仅限)

时间:2015-10-28 02:52:35

标签: ios swift uialertcontroller

我在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()

但是,它会更改整个视图的背景颜色。如何仅更改标题的背景颜色?

3 个答案:

答案 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并且Origin0,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,以便能够使用我们之前打印的地址之一获取子视图。使用guardif 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来设置颜色。