Die Frage ist ähnlich zu iOS 8 Die Textfarbe des UIActivityViewController und der UIAlertController-Schaltfläche verwendet tintColor des Fensters aber in iOS 9.
Ich habe einen UIAlertController und die Schaltfläche "Entlassen" behält die weiße Farbe bei, selbst wenn ich versucht habe, sie einzustellen
[[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor blackColor]];
UIAlertController *strongController = [UIAlertController alertControllerWithTitle:title
message:message
preferredStyle:preferredStyle];
strongController.view.tintColor = [UIColor black];
Ich bin in der Vergangenheit auf etwas Ähnliches gestoßen, und das Problem scheint auf die Tatsache zurückzuführen zu sein, dass die Ansicht des Warnungscontrollers nicht bereit ist, Änderungen der tintColor
zu akzeptieren, bevor sie präsentiert wird. Alternativ können Sie auch die FarbtonfarbeEINSTELLEN, NACHDEMIhren Alert-Controller präsentiert:
[self presentViewController:strongController animated:YES completion:nil];
strongController.view.tintColor = [UIColor black];
In Swift 3.x:
Ich habe folgendes gefunden, um effektiv zu arbeiten. Ich nenne das beim App-Start.
UIView.appearance(whenContainedInInstancesOf: [UIAlertController.self]).tintColor = UIColor.black
Dadurch würde sich die Farbtonfarbe aller UIAlertViewController-Schaltflächenbeschriftungen in Ihrer App global ändern. Die einzige Farbe der Schaltflächenbeschriftung, die nicht geändert wird, sind diejenigen, die einen zerstörenden UIAlertActionStyle haben.
Ich konnte dieses Problem lösen, indem ich UIAlertController
subclassing:
class MyUIAlertController: UIAlertController {
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
//set this to whatever color you like...
self.view.tintColor = UIColor.blackColor()
}
}
Dies überlebt eine Gerätedrehung, während der Alarm angezeigt wird.
Sie müssen tintColor auch nicht einstellen, nachdem Sie die Warnung bei der Verwendung dieser Unterklasse präsentiert haben.
Unter iOS 8.4 ist dies zwar nicht erforderlich, dieser Code funktioniert jedoch auch unter iOS 8.4.
Die Implementierung von Objective-C sollte ungefähr so aussehen:
@interface MyUIAlertController : UIAlertController
@end
@implementation MyUIAlertController
-(void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
//set this to whatever color you like...
self.view.tintColor = [UIColor blackColor];
}
@end
Ziel c
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title text" message:@"Message text" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* ok = [UIAlertAction actionWithTitle:@"Yes" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
//code here…
}];
UIAlertAction* cancel = [UIAlertAction actionWithTitle:@"Later" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
//code here….
}];
[ok setValue:[UIColor greenColor] forKey:@"titleTextColor"];
[cancel setValue:[UIColor redColor] forKey:@"titleTextColor"];
[alertController addAction:ok];
[alertController addAction:cancel];
[alertController.view setTintColor:[UIColor yellowColor]];
[self presentViewController:alertController animated:YES completion:nil];
Swift 3
let alertController = UIAlertController(title: "Title text", message: "Message text", preferredStyle: .alert)
let ok = UIAlertAction(title: "Yes" , style: .default) { (_ action) in
//code here…
}
let cancel = UIAlertAction(title: "Later" , style: .default) { (_ action) in
//code here…
}
ok.setValue(UIColor.green, forKey: "titleTextColor")
cancel.setValue(UIColor.red, forKey: "titleTextColor")
alertController.addAction(ok)
alertController.addAction(cancel)
alertController.view.tintColor = .yellow
self.present(alertController, animated: true, completion: nil)
Es gibt ein Problem beim Einstellen der Farbtonfarbe in der Ansicht nach dem Präsentieren. selbst wenn Sie dies im Vervollständigungsblock von presentViewController tun: animated: completion: bewirkt ein Flimmern der Farbe der Schaltflächentitel. Dies ist schlampig, unprofessionell und völlig inakzeptabel.
Der sichere Weg, dieses Problem zu lösen und überall zu tun, besteht darin, UIAlertController eine Kategorie hinzuzufügen und den viewWillAppear zu aktivieren.
Der Header:
//
// UIAlertController+iOS9TintFix.h
//
// Created by Flor, Daniel J on 11/2/15.
//
#import <UIKit/UIKit.h>
@interface UIAlertController (iOS9TintFix)
+ (void)tintFix;
- (void)swizzledViewWillAppear:(BOOL)animated;
@end
Die Umsetzung:
//
// UIAlertController+iOS9TintFix.m
//
// Created by Flor, Daniel J on 11/2/15.
//
#import "UIAlertController+iOS9TintFix.h"
#import <objc/runtime.h>
@implementation UIAlertController (iOS9TintFix)
+ (void)tintFix {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method method = class_getInstanceMethod(self, @selector(viewWillAppear:));
Method swizzle = class_getInstanceMethod(self, @selector(swizzledViewWillAppear:));
method_exchangeImplementations(method, swizzle);});
}
- (void)swizzledViewWillAppear:(BOOL)animated {
[self swizzledViewWillAppear:animated];
for (UIView *view in self.view.subviews) {
if (view.tintColor == self.view.tintColor) {
//only do those that match the main view, so we don't strip the red-tint from destructive buttons.
self.view.tintColor = [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0];
[view setNeedsDisplay];
}
}
}
@end
Fügen Sie Ihrem Projekt eine .pch (vorkompilierte Kopfzeile) hinzu und fügen Sie die Kategorie hinzu:
#import "UIAlertController+iOS9TintFix.h"
Stellen Sie sicher, dass Sie Ihr pch ordnungsgemäß im Projekt registrieren, und es enthält die Kategoriemethoden in jeder Klasse, die den UIAlertController verwendet.
Anschließend importieren Sie in Ihrer App die Delegaten didFinishLaunchingWithOptions-Methode, und rufen Sie auf
[UIAlertController tintFix];
sie wird automatisch an jede einzelne Instanz von UIAlertController in Ihrer App weitergegeben, unabhängig davon, ob sie von Ihrem Code oder einer anderen Person gestartet wird.
Diese Lösung kann sowohl für iOS 8.X als auch für iOS 9.X verwendet werden, und es fehlt das Flimmern des Ansatzes für die Tönungsänderung nach der Präsentation.
Wahnsinnige Requisiten an Brandon, die diese Reise begonnen haben, leider reichte mein Ruf nicht aus, um seinen Beitrag zu kommentieren.
[[UIView appearance] setTintColor:[UIColor black]];
dadurch werden alle UIView tintColor
- und UIAlertController
-Ansichten geändert
Swift3
Versuchte, UIView.appearance(whenContainedInInstancesOf: [UIAlertController.self]).tintColor = MyColor
zu verwenden, aber dies verhindert, dass andere Elemente, die nicht mit der UIAlertController
zusammenhängen, die tintColor-Konfiguration verwenden. Ich habe es gesehen, als ich versuchte, die Farbe der Elemente der Navigationsleiste zu ändern.
Ich habe zu einer Erweiterung gewechselt (basierend auf der Antwort von Mike Taverne oben) und es funktioniert großartig.
extension UIAlertController {
override open func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
//set this to whatever color you like...
self.view.tintColor = MyColor
}
}
Ich habe eine Lösung dafür gefunden. Keine elegante Lösung, sondern eine Lösung.
Ich habe mit viewWillAppear geschwenkt: auf UIAlertController, dann durch die Ansichten geschlungen und die Tönungsfarbe geändert. In meinem Fall hatte ich eine TintColor-Einstellung für das gesamte Fenster und trotz Einstellung der TintColor-Funktion über das Erscheinungsbild hat der UIAlertController die Farbe auf dem Fenster beibehalten. Ich überprüfe, ob die Farbe der des Fensters entspricht, und wende eine neue an. Wenn Sie tintColor blind auf alle Ansichten anwenden, wird der rote Farbton der zerstörerischen Aktionen zurückgesetzt.
+ (void)load
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method swizzleMethod = class_getInstanceMethod(self, @selector(viewWillAppear:));
Method method = class_getInstanceMethod(self, @selector(alertSwizzle_viewWillAppear:));
method_exchangeImplementations(method, swizzleMethod);
});
}
- (void)alertSwizzle_viewWillAppear:(BOOL)animated
{
[self alertSwizzle_viewWillAppear:animated];
[self applyTintToView:self.view];
}
- (void)applyTintToView:(UIView *)view
{
UIWindow *mainWindow = [UIApplication sharedApplication].keyWindow;
for (UIView *v in view.subviews) {
if ([v.tintColor isEqual:mainWindow.tintColor]) {
v.tintColor = [UIColor greenColor];
}
[self applyTintToView:v];
}
}
Dies funktioniert jedoch nicht unter iOS 8, sodass Sie immer noch die Farbe des Aussehens einstellen müssen.
[[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor greenColor]];
Sie können es ändern mit: Swift 3.x
strongController.view.tintColor = UIColor.green
In Swift 2.2 können Sie folgenden Code verwenden
// LogOut or Cancel
let logOutActionSheet: UIAlertController = UIAlertController(title: "Hello Mohsin!", message: "Are you sure you want to logout?", preferredStyle: .Alert)
self.presentViewController(logOutActionSheet, animated: true, completion: nil)
let cancelActionButton: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
print("Cancel Tapped")
}
logOutActionSheet.addAction(cancelActionButton)
let logOutActionButton: UIAlertAction = UIAlertAction(title: "Clear All", style: .Default)
{ action -> Void in
//Clear All Method
print("Logout Tapped")
}
logOutActionButton.setValue(UIColor.redColor(), forKey: "titleTextColor")
logOutActionSheet.addAction(logOutActionButton)
Sie haben 3 Stile für die Aktionsschaltflächen:
let style : UIAlertActionStyle = .default
// default, cancel (bold) or destructive (red)
let alertCtrl = UIAlertController(....)
alertCtrl.addAction( UIAlertAction(title: "click me", style: style, handler: {
_ in doWhatever()
}))
Ich wollte, dass die Löschschaltfläche rot angezeigt wird. Daher verwendete ich den .destructive-Stil:
alert.addAction(UIAlertAction(title: "Delete", style: .destructive, handler:{(UIAlertAction) in
Am sinnvollsten ist es, die tintColor des Hauptfensters einzustellen. Ein einheitliches Erscheinungsbild ist das, was wir normalerweise brauchen.
// in app delegate
window.tintColor = ...
Andere Lösungen haben Mängel
Verwenden Sie Aussehen
UIView.appearance(whenContainedInInstancesOf: [UIAlertController.self]).tintColor = ...
Funktioniert nicht unter iOS 9, Tests mit iOS 11 SDK.
[[UIView appearance] setTintColor:[UIColor black]];
Sind Sie im Ernst?
Legen Sie fest, dass tintColor der UIAlertController-Ansicht instabil ist. Die Farbe kann sich ändern, wenn der Benutzer die Taste drückt oder nach dem Ansichtslayout.
Die UIAlertController-Unterklasse und die Layout-Methode zum Überschreiben ist Hack-Methode, was inakzeptabel ist.