Подтвердить что ты не робот

Как изменить цвет текста кнопки UIAlertController в iOS9?

Вопрос похож на iOS 8 UIActivityViewController и цвет текста кнопки UIAlertController использует tintColor окна, но в iOS 9.

У меня есть UIAlertController, и кнопка увольнения сохраняет белый цвет, даже я попытался установить

[[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor blackColor]];

UIAlertController *strongController = [UIAlertController alertControllerWithTitle:title
                                                             message:message
                                                      preferredStyle:preferredStyle];
strongController.view.tintColor = [UIColor black];
4b9b3361

Ответ 1

В прошлом я столкнулся с чем-то подобным, и проблема, похоже, связана с тем, что представление диспетчера предупреждений не готово принять изменения tintColor до его представления. В качестве альтернативы попробуйте установить цвет оттенков ПОСЛЕ того, как вы представите свой контроллер предупреждений:

[self presentViewController:strongController animated:YES completion:nil];
strongController.view.tintColor = [UIColor black];

Ответ 2

Я смог решить это путем подкласса UIAlertController:

class MyUIAlertController: UIAlertController {

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()

        //set this to whatever color you like...
        self.view.tintColor = UIColor.blackColor()
    }
}

Это сохраняется при вращении устройства, пока отображается предупреждение.

Вам также не нужно устанавливать tintColor после представления предупреждения при использовании этого подкласса.

Хотя это не обязательно для iOS 8.4, этот код действительно работает и на iOS 8.4.

Objective-C реализация должна быть примерно такой:

@interface MyUIAlertController : UIAlertController
@end

@implementation MyUIAlertController
-(void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];

    //set this to whatever color you like...
    self.view.tintColor = [UIColor blackColor];
}
@end

Ответ 3

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

Ответ 4

Существует проблема с настройкой цвета оттенка на представлении после представления; даже если вы сделаете это в блоке завершения presentViewController: анимированный: завершение:, это вызывает мерцание на цвет названия кнопок. Это небрежно, непрофессионально и совершенно неприемлемо.

Единственный верный способ решить эту проблему и сделать ее повсюду - это добавить категорию в UIAlertController и swizzling viewWillAppear.

Заголовок:

//
//  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

Реализация:

//
//  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

Добавьте в проект .pch(предварительно скомпилированный заголовок) и включите категорию:

#import "UIAlertController+iOS9TintFix.h"

Убедитесь, что вы правильно зарегистрировали свой проект в проекте, и он будет включать методы категорий в каждом классе, который использует UIAlertController.

Затем в вашем приложении делегатов метод didFinishLaunchingWithOptions, импортируйте свою категорию и вызовите

[UIAlertController tintFix];

и он автоматически распространяется на каждый экземпляр UIAlertController в вашем приложении, независимо от того, запущен ли ваш код или кто-либо еще.

Это решение работает как для iOS 8.X, так и для iOS 9.X и не имеет мерцания подхода пост-презентации с изменением оттенка.

Безумный реквизит Брэндона выше для начала этого путешествия, к сожалению, моей репутации недостаточно, чтобы прокомментировать его сообщение, иначе я бы оставил его там!

Ответ 5

В Swift 3.x:

Я нашел следующее, чтобы работать эффективно. Я называю это при запуске приложения.

UIView.appearance(whenContainedInInstancesOf: [UIAlertController.self]).tintColor = UIColor.black

Таким образом, это изменит цвет оттенков всех ярлыков кнопок UIAlertViewController в вашем приложении по всему миру. Единственный цвет ярлыка кнопки, который он не меняет, - это те, которые имеют UIAlertActionStyle разрушительного.

Ответ 6

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

это изменит все UIView tintColor, а также UIAlertController view

Ответ 7

swift3

Пытался использовать UIView.appearance(whenContainedInInstancesOf: [UIAlertController.self]).tintColor = MyColor, но это предотвращает другие элементы, не связанные с UIAlertController из конфигурации tintColor. Я видел это, пытаясь изменить цвет элементов панели навигации.

Я переключился на расширение (на основе ответа Майка Таверны выше), и он отлично работает.

extension UIAlertController {

override open func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    //set this to whatever color you like...
    self.view.tintColor = MyColor
}
}

Ответ 8

Я нашел решение этого. Не изящное решение, а решение.

Я swizzled viewWillAppear: на UIAlertController, затем зациклился на представлениях и изменил цвет оттенка. В моем случае у меня был tintColor, установленный во всем окне, и, несмотря на установку tintColor по внешнему виду, UIAlertController поддерживал цвет в окне. Я проверяю, совпадает ли цвет с окном, и если применим новый. Слепое применение tintColor ко всем представлениям приведет к красному оттенку деструктивных действий reset.

+ (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];  
    }  
}  

Однако это не работает на iOS 8, поэтому вам все равно нужно установить цвет оттенка опер.

[[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor greenColor]];  

Ответ 9

В Swift 2.2 вы можете использовать следующий код

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

Ответ 10

Вы можете изменить его, используя: Swift 3.x

    strongController.view.tintColor = UIColor.green

Ответ 11

У вас есть 3 стиля для кнопок действий:

let style : UIAlertActionStyle = .default
// default, cancel (bold) or destructive (red)

let alertCtrl = UIAlertController(....)
alertCtrl.addAction( UIAlertAction(title: "click me", style: style, handler: {
    _ in doWhatever()
}))

Ответ 12

Я хотел сделать кнопку удаления красным, поэтому я использовал стиль .destructive:

 alert.addAction(UIAlertAction(title: "Delete", style: .destructive, handler:{(UIAlertAction) in