UIAlertController色调默认为高亮显示为蓝色

时间:2015-09-21 10:50:54

标签: ios objective-c ios9 uialertcontroller

我使用以下代码来呈现UIAlertController操作表,其中项目文本为红色。我已经使用了色调属性来设置颜色。

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

文本颜色似乎在突出显示或选择时默认为蓝色。这是正常的,我该如何阻止它?

11 个答案:

答案 0 :(得分:48)

这是一个已知的Bug,请参阅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()
})

一个注意:这不完全修复Bug。您将在设备旋转时注意到按钮按系统默认(=蓝色)色调重新着色。

预计它将通过iOS 9.1修复。

2015年10月23日编辑:iOS 9.1仍未修复。几天前发布的iOS 9.1 + Xcode 7.1(7B91B)重新测试。截至目前设置.tintColor不起作用,但是如您所述,您可以设置整个应用程序的tintColor,例如在AppDelegate中,didFinishLaunchingWithOptions设置为window?.tintColor = UIColor.redColor()这也会使AlertController Buttons 着色,但在某些情况下可能不适合,因为此色调适用于整个应用程序。

答案 1 :(得分:38)

只需在presentViewController之后添加tintColor即可。适用于iOS 9.0.2

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

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

答案 2 :(得分:13)

您还可以在appdelegate中更改应用色调颜色。

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

非常适合我。

答案 3 :(得分:6)

更新Swift 4,Xcode 9

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

答案 4 :(得分:5)

您可以像这样更改按钮颜色

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 :(得分:1)

traitCollectionDidChange的子类UIAlertController中设置您的色调颜色。

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

答案 6 :(得分:1)

要像这样设置自定义颜色字体子类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)

像这样(像往常一样)使用

var data = new FormData()
var file = document.getElementById('my-file-element').files[0]
data.set('key', file)

// Send ajax as normal with formdata body.

答案 7 :(得分:1)

只需将您的视图tintAdjustmentMode更改为UIViewTintAdjustmentModeNormal,这样就不会在dimm上更改它的颜色。

答案 8 :(得分:0)

我仍然对你想要达到的目标感到困惑。但您可以尝试Apple创建Destructive按钮的方式(默认情况下文本颜色为红色)。

您要创建UIAlertAction的代码不要将Default样式用于您想要的红色按钮。而是使用UIAlertActionStyleDestructive。示例代码:

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

                         }];

答案 9 :(得分:0)

UIAlertController可用于iOS 8及更高版本,因此旧版本的设备存在错误。具有相应或更高版本的设备没有问题。

答案 10 :(得分:0)

为了防止新色调颜色的快速“弹出”,可以动画警报控制器的alpha值。然后它看起来完全一样,如果没有错误:

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