Ich verwende den folgenden Code, um ein UIAlertController-Aktionsblatt mit dem Elementtext als rot darzustellen. Ich habe die Tönungseigenschaft verwendet, um die Farbe festzulegen.
UIAlertController *alertController = [UIAlertController
alertControllerWithTitle:nil
message:nil
preferredStyle:UIAlertControllerStyleActionSheet];
alertController.view.tintColor = [UIColor redColor];
Die Textfarbe scheint bei Hervorhebung oder Auswahl standardmäßig blau zu sein. Ist das normal und wie höre ich damit auf?
Dies ist ein bekannter Fehler, siehe https://openradar.appspot.com/22209332
Um dies zu beheben, wenden Sie die Tönungsfarbe erneut im Completion-Handler an. Hier ist meine schnelle Lösung, die Sie leicht für ObjC anpassen können:
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()
})
Eine Anmerkung: Dies behebt den Fehler nicht vollständig. Bei der Gerätedrehung werden Sie feststellen, dass die Schaltflächen mit dem Farbton "System Default" (= Blau) neu eingefärbt werden.
Erwarten Sie, dass es mit iOS 9.1 behoben wird.
Edit 23.10.2015: Immer noch nicht behoben mit iOS 9.1. Erneut getestet mit iOS 9.1 + Xcode 7.1 (7B91B), das vor einigen Tagen veröffentlicht wurde. Ab jetzt funktioniert die Einstellung von .tintColor nicht. Sie können jedoch, wie kommentiert, die tintColor der gesamten Anwendung einstellen, z. in AppDelegate hat didFinishLaunchingWithOptions window?.tintColor = UIColor.redColor()
gesetzt. Dies färbt auch die AlertController-Schaltflächen ein, kann jedoch in einigen Fällen nicht geeignet sein, da diese Tönung in der gesamten Anwendung angewendet wird.
Fügen Sie einfach tintColor nach dem presentViewController hinzu. Funktioniert auf iOS 9.0.2
[self presentViewController:alertController animated:YES completion:nil];
[alertController.view setTintColor:[UIColor yellowColor]];
Sie können die Farbtonfarbe der App auch in appdelegate ändern.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window.tintcolor = [UIColor yellowColor];
return YES;
}
funktioniert perfekt für mich.
Update für Swift 4, Xcode 9
private static func setupAppearanceForAlertController() {
let view = UIView.appearance(whenContainedInInstancesOf: [UIAlertController.self])
view.tintColor = .black
}
Sie können die Tastenfarbe auf diese Weise ändern
UIAlertAction* button = [UIAlertAction
actionWithTitle:@"Delete Profile"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action)
{
//Add Action.
}];
[button setValue:[UIColor redColor] forKey:@"titleTextColor"];
Über diese Zeile [Taste setValue: [UIColor redColor] forKey: @ "titleTextColor"]; Sie können die Schaltflächenfarbe Ihres Aktionsblatts ändern
Ändern Sie einfach Ihre Ansicht tintAdjustmentMode in UIViewTintAdjustmentModeNormal, damit die Farbe bei dimm nicht geändert wird.
Legen Sie Ihre Farbtonfarbe in traitCollectionDidChange
in einer Unterklasse von UIAlertController
fest.
override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
self.view.tintColor = UIColor.redColor()
}
So legen Sie benutzerdefinierte color und font subclass UIAlertController
fest.
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)
}
}
}
}
Verwenden Sie so (wie Sie es normalerweise tun würden)
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)
Ich bin immer noch verwirrt, was Sie erreichen wollen. Sie können jedoch versuchen, auf die Art und Weise von Apple Destructive
-Schaltflächen zu erstellen (standardmäßig ist die Textfarbe Rot).
Der Code, in dem Sie UIAlertAction
s erstellen, verwendet nicht den Default
-Stil für die gewünschten Schaltflächen in roter Farbe. Verwenden Sie stattdessen UIAlertActionStyleDestructive
. Beispielcode :
UIAlertAction* cancel = [UIAlertAction
actionWithTitle:@"Cancel"
style:UIAlertActionStyleDestructive
handler:^(UIAlertAction * action)
{
[view dismissViewControllerAnimated:YES completion:nil];
}];
Um das schnelle "Aufspringen" der neuen Tönungsfarbe zu verhindern, kann der Alpha-Wert des Alarmcontrollers animiert werden. Dann sieht es genauso aus, als ob da kein Fehler wäre:
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)
}
UIAlertController ist ab iOS 8 verfügbar, daher gibt es einen Fehler für Geräte mit älterer Version. Es gibt kein Problem für Geräte mit entsprechender oder höherer Version.