web-dev-qa-db-ja.com

UIAlertControllerの色はデフォルトでハイライト時に青になります

次のコードを使用して、アイテムテキストが赤のUIAlertControllerアクションシートを表示します。色を設定するために、tintプロパティを使用しました。

UIAlertController *alertController = [UIAlertController
                                      alertControllerWithTitle:nil
                                      message:nil
                                      preferredStyle:UIAlertControllerStyleActionSheet];
alertController.view.tintColor = [UIColor redColor];

テキストの色は、ハイライトまたは選択時にデフォルトで青になっているようです。これは正常ですか、これをどのように停止しますか?

31
Bcf Ant

これは既知のバグです。 https://openradar.appspot.com/22209332 を参照してください

修正するには、完了ハンドラーで色合いを再適用します。ここに私のSwiftソリューションがあります。ObjCに簡単に適合させることができます。

_alertController.view.tintColor = UIColor.redColor() // apply 1st time to prevent flicker from Blue to Red when displaying

navigationController?.presentViewController(alertController, animated: true, completion: {
    // Bugfix: iOS9 - Tint not fully Applied without Reapplying
    alertController.view.tintColor = UIColor.redColor()
})
_

注:これでバグが完全に修正されるわけではありません。デバイスが回転すると、ボタンがシステムデフォルト(=青)の色合いに変更されます。

IOS 9.1で修正される予定です。

編集10/23/2015:iOS 9.1ではまだ修正されていません。数日前にリリースされたiOS 9.1 + Xcode 7.1(7B91B)で再テストされました。現在、.tintColorの設定は機能しませんが、コメントされているように、アプリケーション全体のtintColorを設定できます。 AppDelegate didFinishLaunchingWithOptionsでwindow?.tintColor = UIColor.redColor()を設定します。 これはAlertController Buttonsにも色合いを付けますが、この色合いはアプリケーション全体に適用されるため、場合によっては適切ではありません。

PresentViewControllerの後にtintColorを追加するだけです。 iOS 9.0.2で動作します

[self presentViewController:alertController animated:YES completion:nil];

[alertController.view setTintColor:[UIColor yellowColor]];
38
Eddy

Appdelegateでアプリの色合いを変更することもできます。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window.tintcolor = [UIColor yellowColor];
    return YES;
}

私にぴったりです。

13
marco v berlo

Swift 4、Xcode 9の更新

private static func setupAppearanceForAlertController() {
    let view = UIView.appearance(whenContainedInInstancesOf: [UIAlertController.self])
    view.tintColor = .black
}
6
Ben M

このようにボタンの色を変更できます

UIAlertAction* button = [UIAlertAction
                              actionWithTitle:@"Delete Profile"
                              style:UIAlertActionStyleDefault
                              handler:^(UIAlertAction * action)
                              {
                                  //Add Action.
                              }];
[button setValue:[UIColor redColor] forKey:@"titleTextColor"];

この行を使用して[button setValue:[UIColor redColor] forKey:@ "titleTextColor"];アクションシートのボタンの色を変更できます

5

traitCollectionDidChangeのサブクラスのUIAlertControllerに色合いを設定します。

override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
    self.view.tintColor = UIColor.redColor()
}
2
laynemoseley

ビューのtintAdjustmentModeをUIViewTintAdjustmentModeNormalに変更するだけで、淡色表示の色は変更されません。

1
Alexander

カスタムcolorおよびfontを設定するには、サブクラスUIAlertControllerを次のようにします。

import UIKit

class StyledAlertController: UIAlertController {

    private var cancelText:String?

    override func viewDidLoad() {
        super.viewDidLoad()
        view.tintColor = YourColor
    }

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        findLabel(view)
    }

    private func findLabel(scanView: UIView!) {
        if (scanView.subviews.count > 0) {
            for subview in scanView.subviews {
                if let label:UILabel = subview as? UILabel {
                    if (cancelText != nil && label.text == cancelText!) {
                        dispatch_async(dispatch_get_main_queue(),{
                            label.textColor = YourColor
                            label.tintColor = YourColor
                        })
                    }
                    let font:UIFont = UIFont(name: YourFont, size: label.font!.pointSize)!
                    label.font = font
                }
                findLabel(subview)
            }
        }
    }
}

このように使用します(通常どおり)

let StyledAlertController = StyledAlertController(title: "My Title", message: "My Message", preferredStyle: .ActionSheet)

let cancelAction:UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
        print("Cancel Action Click")
    }
actionSheetController.addAction(cancelAction)

let anotherAction:UIAlertAction = UIAlertAction(title: "Another Action", style: .Default) { action -> Void in
        print("Another Action Click")
    }
actionSheetController.addAction(anotherAction:UIAlertAction)

presentViewController(actionSheetController, animated: true, completion: nil)
1
Michael

私はまだあなたが達成したいことを混乱しています。しかし、Destructiveボタンを作成するAppleの方法を試すことができます(デフォルトではテキストの色は赤です)。

UIAlertActionsを作成しているコードでは、赤色のボタンにDefaultスタイルを使用しません。代わりにUIAlertActionStyleDestructiveを使用してください。サンプルコード:

UIAlertAction* cancel = [UIAlertAction
                         actionWithTitle:@"Cancel"
                         style:UIAlertActionStyleDestructive
                         handler:^(UIAlertAction * action)
                         {
                             [view dismissViewControllerAnimated:YES completion:nil];

                         }];
0
Vinay Jain

新しいティントカラーの高速「ポップアップ」を防ぐために、アラートコントローラーのアルファ値をアニメーション化できます。バグがない場合とまったく同じに見えます:

    alertController.view.alpha = 0.0
    presentViewController(alertController, animated: false) {
        alertController.view.tintColor = UIColor.redColor()
        UIView.animateWithDuration(0.2, animations: { alertController.view.alpha = 1.0 }, completion: nil)
    }
0
Darko

UIAlertControllerはiOS 8以降のavailabelです。したがって、古いバージョンのデバイスにはバグがあります。対応するバージョン以上のデバイスには問題はありません。

0
G.Hakobyan