UIAlertController 更改字体颜色

Posted

技术标签:

【中文标题】UIAlertController 更改字体颜色【英文标题】:UIAlertController change font color 【发布时间】:2015-01-12 05:34:12 【问题描述】:

这是我创建 UIAlertController 的代码

    // Create the alert controller
    var alertController = UIAlertController(title: "Are you sure you want to call \(self.number)?", message: "", preferredStyle: .Alert)

    // Create the actions
    var okAction = UIAlertAction(title: "Call", style: UIAlertActionStyle.Default) 
        UIAlertAction in
        var url:NSURL = NSURL(string: "tel://\(self.number)")!
        UIApplication.sharedApplication().openURL(url)
    

    var cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel) 
        UIAlertAction in

    

    // Add the actions
    alertController.addAction(okAction)
    alertController.addAction(cancelAction)

    // Present the controller
    self.presentViewController(alertController, animated: true, completion: nil)

我不知道如何更改取消和呼叫操作的文本颜色。标题文本当前为黑色,取消和呼叫按钮为白色。我正在使它们全部变黑以获得更好的可见度。有任何想法吗?谢谢!

【问题讨论】:

【参考方案1】:

经过反复试验,我发现这行得通。希望这将有助于未来的 swift 新人!

alertController.view.tintColor = UIColor.blackColor()

【讨论】:

这在警报第一次出现时对我有用。但是在单击按钮后,它们又变回了默认颜色。根据我在其他地方读到的内容,我认为这个问题在 ios 9 中可能是新问题。 因为这在 iOS 9 中不起作用,这里是设置 UIAlertController 按钮的 tintColor 的解决方法:***.com/a/32636878/4376309【参考方案2】:

Piyush 的回答对我帮助最大,但这里有一些针对 Swift 3 的调整以及分别更改标题和消息。

标题:

alert.setValue(NSAttributedString(string: alert.message, attributes: [NSFontAttributeName : UIFont.systemFont(ofSize: 29, weight: UIFontWeightMedium), NSForegroundColorAttributeName : UIColor.red]), forKey: "attributedTitle")

消息:

alert.setValue(NSAttributedString(string: alert.message, attributes: [NSFontAttributeName : UIFont.systemFont(ofSize: 29, weight: UIFontWeightMedium), NSForegroundColorAttributeName : UIColor.red]), forKey: "attributedMessage")

大字体是因为我实际上需要为 tvOS 做它,在它和 iOS 上效果很好。

【讨论】:

对于 Title 必须有: alert.setValue(NSAttributedString(string: alert.title, attributes: [NSFontAttributeName : UIFont.systemFont(ofSize: 29, weight: UIFontWeightMedium), NSForegroundColorAttributeName : UIColor.red] ), forKey: "attributedTitle")【参考方案3】:

斯威夫特 4.2

这样做的一种方法是在 UIAlertController 上进行扩展,这样您的所有应用警报都将具有相同的色调。但它会将破坏性行为显示为红色。

 extension UIAlertController
        open override func viewDidLayoutSubviews() 
            super.viewDidLayoutSubviews()
           self.view.tintColor = .yourcolor
        
    

【讨论】:

【参考方案4】:

以下代码正在更改UIAlertView 标题颜色。

  let alert = UIAlertController(title: messageTitle, message: messageText, preferredStyle: UIAlertControllerStyle.Alert)

  alert.setValue(NSAttributedString(string: messageTitle, attributes: [NSFontAttributeName : UIFont.systemFontOfSize(17),NSForegroundColorAttributeName : UIColor.redColor()]), forKey: "attributedTitle")

  alert.addAction(UIAlertAction(title: buttonText, style: UIAlertActionStyle.Default, handler: nil))

  parent.presentViewController(alert, animated: true, completion: nil)

如果要更改按钮颜色,请在当前视图控制器之后添加以下代码。

  alert.view.tintColor = UIColor.redColor()

【讨论】:

【参考方案5】:

以下是 Swift 4 的更新,以 Cody 的回答为基础:

为警报标题设置颜色:

alert.setValue(NSAttributedString(string: alert.title!, attributes: [NSAttributedStringKey.font : UIFont.systemFont(ofSize: 17, weight: UIFont.Weight.medium), NSAttributedStringKey.foregroundColor : UIColor.blue]), forKey: "attributedTitle")

为警报消息设置颜色:

alert.setValue(NSAttributedString(string: alert.message, attributes: [NSAttributedStringKey.font : UIFont.systemFont(ofSize: 17, weight: UIFont.Weight.Medium), NSAttributedStringKey.foregroundColor : UIColor.green]), forKey: "attributedMessage")

根据https://developer.apple.com/documentation/foundation/nsattributedstring/key

【讨论】:

只有一次编辑;您在颜色示例中缺少 .font【参考方案6】:

Swift 5XCode 11.1 及更高版本中,警报标题的颜色

alert.setValue(NSAttributedString(string: alert.title!, attributes: [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 25, weight: UIFont.Weight.medium), NSAttributedString.Key.foregroundColor : UIColor.red]), forKey: "attributedTitle")

警报消息的颜色:

alert.setValue(NSAttributedString(string: alert.message!, attributes: [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 20,weight: UIFont.Weight.medium),NSAttributedString.Key.foregroundColor :UIColor.black]), forKey: "attributedMessage")

【讨论】:

【参考方案7】:

我遇到了同样的问题,并花了很多时间试图找到为 iOS 9 和 iOS 10 + 更改颜色的最佳方法,因为它以不同的方式实现。

最后我为 UIViewController 做了一个扩展。在扩展中,我添加了几乎等于默认功能“present”的自定义功能,但执行颜色修复。这是我的解决方案。适用于swift 3+,适用于目标从iOS 9开始的项目:

extension UIViewController 
    /// Function for presenting AlertViewController with fixed colors for iOS 9
    func presentAlert(alert: UIAlertController, animated flag: Bool, completion: (() -> Swift.Void)? = nil)
        // Temporary change global colors
        UIView.appearance().tintColor = UIColor.red // Set here whatever color you want for text
        UIApplication.shared.keyWindow?.tintColor = UIColor.red // Set here whatever color you want for text

        //Present the controller
        self.present(alert, animated: flag, completion: 
            // Rollback change global colors
            UIView.appearance().tintColor = UIColor.black // Set here your default color for your application.
            UIApplication.shared.keyWindow?.tintColor = UIColor.black // Set here your default color for your application.
            if completion != nil 
                completion!()
            
        )
    

要使用这个固定函数,你应该只调用这个函数而不是默认的 present 函数。示例:

self.presentAlert(alert: alert, animated: true)

相同的解决方案,但针对 UIActivityViewController:

extension UIViewController 
    /// Function for presenting UIActivityViewController with fixed colors for iOS 9 and 10+
    func presentActivityVC(vc: UIActivityViewController, animated flag: Bool, completion: (() -> Swift.Void)? = nil) 
        // Temporary change global colors for changing "Cancel" button color for iOS 9 and 10+
        if UIDevice.current.systemVersion.range(of: "9.") != nil 
            UIApplication.shared.keyWindow?.tintColor = ColorThemes.alertViewButtonTextColor
         else 
            UILabel.appearance().textColor = ColorThemes.alertViewButtonTextColor
        

        self.present(vc, animated: flag) 
            // Rollback for changing global colors for changing "Cancel" button color for iOS 9 and 10+
            if UIDevice.current.systemVersion.range(of: "9.") != nil 
                UIApplication.shared.keyWindow?.tintColor = ColorThemes.tintColor
             else 
                UILabel.appearance().textColor = ColorThemes.textColorNormal
            
            if completion != nil 
                completion!()
            
        
    

我希望这对某人有所帮助并节省大量时间。因为这么详细的答案并没有节省我的时间:)

【讨论】:

【参考方案8】:

试试这个

alert.setValue(NSAttributedString(string: alert.message, attributes: [NSFontAttributeName : UIFont.systemFont(ofSize: 29, weight: UIFontWeightMedium), NSForegroundColorAttributeName : UIColor.red]), forKey: "attributedTitle")

【讨论】:

【参考方案9】:

在 iOS 9.0 之前,您可以像这样简单地更改底层视图的 tintColor

alertController.view.tintColor = UIColor.redColor()

但是,由于 iOS 9 中引入了一个错误,您可以:

    在 AppDelegate 中更改应用 tintColor。

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool 
        self.window.tintColor = UIColor.redColor()
        return true
    
    

    在完成块中重新应用颜色。

    self.presentViewController(alert, animated: true, completion: () -> Void in
        alert.tintColor = UIColor.redColor()
    )
    

在这里查看我的其他答案:https://***.com/a/37737212/1781087

【讨论】:

以上是关于UIAlertController 更改字体颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIAlertController 中更改 UIAlertAction 的字体大小和颜色

ios ~ UIAlertcontroller 设置字体颜色

[iOS]改变UIAlertController的标题内容的字体和颜色

UIAlertController 简单修改title以及按钮的字体颜色

Swift 之自定义 UIAlertController

更改 UIAlertController 选择的按钮颜色