webentwicklung-frage-antwort-db.com.de

Wie ändert man die Textfarbe der UIAlertController-Schaltfläche in iOS9?

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];
24
RayChen

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];
55
dbart

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.

13
Neil Smith

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
12
Mike Taverne

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)
11
MAhipal Singh

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.

4
ObiDan
[[UIView appearance] setTintColor:[UIColor black]];  

dadurch werden alle UIView tintColor- und UIAlertController-Ansichten geändert

3
lin

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
}
}
3
Mike M

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]];  
2

Sie können es ändern mit: Swift 3.x

    strongController.view.tintColor = UIColor.green
2
Dheeraj D

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)
1
Mohsin Qureshi

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()
}))
0
Ferran Maylinch

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
0
fullMoon

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.

0
BB9z