web-dev-qa-db-ja.com

UIAlertControllerフォントの色を変更

これが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)

キャンセルおよび呼び出しアクションのテキストの色を変更する方法がわかりません。タイトルテキストは現在黒で、キャンセルボタンと通話ボタンは白です。見やすくするために、すべて黒にするようにしています。何か案は?ありがとう!

18
leerob

何度か試行錯誤した結果、これが機能することがわかりました。うまくいけば、これが将来に役立つでしょうSwift初心者!

alertController.view.tintColor = UIColor.blackColor()
18
leerob

Swift 4.2

これを行う1つの方法は、UIAlertControllerで拡張を作成することです。これにより、すべてのアプリアラートが同じ色合いになります。しかし、それは破壊的な行動を赤い色のままにします。

 extension UIAlertController{
        open override func viewDidLayoutSubviews() {
            super.viewDidLayoutSubviews()
           self.view.tintColor = .yourcolor
        }
    }
8
Karlicic Bojan

以下のコードは、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)

ボタンの色を変更したい場合は、現在のView Controllerの後に次のコードを追加します。

  alert.view.tintColor = UIColor.redColor()
6
Piyush Sanepara

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で実行する必要があったためです。

5
CodyMace

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 のとおり

2
podomunro

私は同じ問題に直面し、iOS 9とiOS 10 +の色を変更するための最良の方法を見つけるために多くの時間を費やしました。

最後に、UIViewControllerの拡張を作成しました。拡張機能では、デフォルト機能「現在」にほぼ等しいカスタム機能を追加しましたが、色の修正を実行します。これが私の解決策です。 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!()
            }
        })
    }
}

この固定関数を使用するには、デフォルトの現在の関数の代わりにこの関数を呼び出すだけです。例:

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!()
            }
        }
    }
}

これが誰かを助け、多くの時間を節約することを願っています。私の時間はそのような詳細な答えによって救われなかったので:)

1
DJ-Glock

IOS 9.0より前のバージョンでは、基になるビューのtintColorを次のように変更するだけでした。

alertController.view.tintColor = UIColor.redColor()

ただし、iOS 9で導入されたバグのため、次のいずれかを行うことができます。

  1. AppDelegateでアプリのtintColorを変更します。

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
        self.window.tintColor = UIColor.redColor()
        return true
    }
    
  2. 完了ブロックで色を再適用します。

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

私の他の答えをここで参照してください: https://stackoverflow.com/a/37737212/1781087

0
guidev