Как изменить размер и цвет шрифта текста UIAlertAction

Как изменить размер и цвет текста UIAlertAction? Я взял UIAlertController в соответствии с ним, как изменить размер. Это мой код

UIAlertController *controller = [UIAlertController alertControllerWithTitle:@"Do you wish to logout?" message:@"" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *logOut = [UIAlertAction actionWithTitle:@"Log Out" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {}];

Теперь мне нужен текст «Выход» с размером шрифта 22, зеленым цветом и полужирным шрифтом.


person naomi    schedule 10.06.2016    source источник
comment
Вам нужно установить tintColor См. мой ответ здесь: stackoverflow.com/a/37737212/1781087   -  person guidev    schedule 10.06.2016
comment
Как tintColor может изменить размер шрифта??   -  person naomi    schedule 10.06.2016
comment
[controller.view setTintColor: [UIColor yellowColor]]; для изменения цвета оттенка.   -  person Himanshu padia    schedule 10.06.2016
comment
Возможный дубликат Можно ли редактировать заголовок UIAlertAction размер и стиль шрифта?   -  person Maximilian Ast    schedule 04.08.2016


Ответы (7)


Вы можете обновить цвет текста, используя

       UIAlertAction *myGoalAction = [UIAlertAction
                                    actionWithTitle:NSLocalizedString(@"My Title", @"My Title")
                                    style:UIAlertActionStyleDefault
                                    handler:^(UIAlertAction *action)
                                    {

                                    }];
       [myGoalAction setValue:[UIColor greenColor] forKey:@"titleTextColor"];

Нет эффективного способа обновить размер шрифта. Я предлагаю вам использовать стандартный размер шрифта.

Метка заголовка UIAlertAction является частной переменной и недоступна напрямую. Метка входит в 3-уровневую иерархию частного представления. Отображение действия выхода из системы более крупным шрифтом имеет смысл для приложения.

Доступно множество решений с открытым исходным кодом. Я рекомендую попробовать это

person kaushal    schedule 10.06.2016
comment
Требование моего клиентского приложения отображать шрифт LogOut размером 17 и жирным полужирным шрифтом. - person naomi; 10.06.2016
comment
Метка заголовка UIAlertAction является частной переменной и недоступна напрямую. Метка входит в 3-уровневую иерархию частного представления. Таким образом, обновление с использованием взлома приведет к ошибке пользователя (пользовательский интерфейс не будет обновляться случайным образом, что будет трудно исправить позже). Отображение действия выхода из системы более крупным шрифтом имеет смысл для приложения. Существует множество доступных решений с открытым исходным кодом. Я упомянул один в своем ответе. - person kaushal; 11.06.2016
comment
Я предлагаю использовать это решение, если это категория над контроллером UIAlertView. и иметь хороший рейтинг в своем роде промежутка времени. - person kaushal; 11.06.2016
comment
для пользователей swift3: let alertAction: UIAlertAction(title: "Acknowledge", style: .default, handler: nil) alertAction.setValue(UIColor.green, forKey: "titleTextColor") если вы хотите изменить цвет текста кнопки в контроллере предупреждений - person Achintya Ashok; 19.02.2017

Вот решение для изменения цвета текста в Swift:

let alert = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
action.setValue(UIColor.black, forKey: "titleTextColor")

Или вы можете использовать это расширение:

extension UIAlertAction {
    var titleTextColor: UIColor? {
        get { return self.value(forKey: "titleTextColor") as? UIColor } 
        set { self.setValue(newValue, forKey: "titleTextColor") }
    }
}
person Francois Nadeau    schedule 24.01.2020

Я написал расширение

extension UIAlertController{
    open override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        for i in self.actions {
            let attributedText = NSAttributedString(string: i.title ?? "", attributes: [NSAttributedString.Key.font : UIFont(name: "SFProText-Semibold", size: 20.0)!])

            guard let label = (i.value(forKey: "__representer") as AnyObject).value(forKey: "label") as? UILabel else { return }
            label.attributedText = attributedText
        }

    }
}
person Farhad Faramarzi    schedule 18.03.2020

Изменить цвет довольно просто.

Однако вы можете просто изменить tintColor основного представления из-за известной ошибки, появившейся в iOS 9 (https://openradar.appspot.com/22209332), tintColor переопределяется цветом tintColor окна приложения.

См. мой полный ответ на: Как изменить цвет оттенка UIAlertController< /а>


Не следует менять шрифт UIAlertController. Однако это все еще можно сделать, см.
этот ответ

person guidev    schedule 10.06.2016
comment
а размер шрифта?? - person naomi; 10.06.2016

Вот мой ответ Swift 5. Мы можем применить пользовательские шрифты к AlertView и AlertAddAction.
1-е создание расширения AlertView. Внутреннее расширение

import Foundation
import UIKit

extension UIAlertController {
    
    func applyBranding() {
        
        applyAlertTitleBranding()
        applyAlertMessageBranding()
    }
    
    func applyAlertTitleBranding() {
        let titleFont = [kCTFontAttributeName: UIFont(name: "Montserrat-Medium", size: 18.0)!]
        let titleAttrString = NSMutableAttributedString(string: title!, attributes: titleFont as [NSAttributedString.Key : Any])
        let titleColor = UIColor(red: 34.0/255/0, green: 34.0/255/0, blue: 34.0/255/0, alpha: 1.0)
        titleAttrString.addAttribute(NSAttributedString.Key.foregroundColor,
                                     value: titleColor,
                                     range: NSRange(location: 0, length: title!.count))
        setValue(titleAttrString, forKey: "attributedTitle")
    }
    
    func applyAlertMessageBranding() {
        let messageFont = [kCTFontAttributeName: UIFont(name: "Montserrat-Regular", size: 14.0)!]
        let messageAttrString = NSMutableAttributedString(string: message!, attributes: messageFont as [NSAttributedString.Key : Any])
        let messageTitleColor = UIColor(red: 68.0/255/0, green: 68.0/255/0, blue: 68.0/255/0, alpha: 1.0)
        messageAttrString.addAttribute(NSAttributedString.Key.foregroundColor,
                                       value: messageTitleColor,
                                       range: NSRange(location: 0, length: message!.count))
        setValue(messageAttrString, forKey: "attributedMessage")
    }
    
    func applyNoActionBranding() {
        let font = [kCTFontAttributeName: UIFont(name: "Montserrat-Medium", size: 16.0)!]
        for actionButton in actions {
            let titleAttrString = NSMutableAttributedString(string: actionButton.title!, attributes: font as [NSAttributedString.Key : Any])
            actionButton.setValue(titleAttrString, forKey: "attributedTitleForAction")
        }
    }
    
    func applyYesActionBranding() {
        let font = [kCTFontAttributeName: UIFont(name: "Montserrat-Regular", size: 16.0)!]
        for actionButton in actions {
            let titleAttrString = NSMutableAttributedString(string: actionButton.title!, attributes: font as [NSAttributedString.Key : Any])
            actionButton.setValue(titleAttrString, forKey: "attributedTitleForAction")
        }
    }
}



 

Во-вторых, вызывайте эти функции AlertView везде, где вам нужно. Например, вызов ViewDidLoad()

override func viewDidLoad() {
    super.viewDidLoad()

    showAlert()
}

func showAlert() {

    let alertVc = UIAlertController(title: "Some Title", message: "Some message", preferredStyle: .alert)
    
    //No action
    let noAction = UIAlertAction(title: "No", style: .default, handler: {
        (alert: UIAlertAction!) -> Void in
        alertVc.dismiss(animated: true, completion: nil)
    })
    
    //Yes action
    let yesAction = UIAlertAction(title: "Yes", style: .default, handler: {
        (alert: UIAlertAction!) -> Void in
        self.deleteFunction(address)
        alertVc.dismiss(animated: true, completion: nil)
    })
    
    alertVc.applyBranding()
    alertVc.applyNoActionBranding()
    alertVc.applyYesActionBranding()
    alertVc.addAction(noAction)
    alertVc.addAction(yesAction)
    
    alertVc.view.tintColor = .blue
    DispatchQueue.main.async(execute: {
        self.present(alertVc, animated: true, completion: nil)
    })
}

Надеюсь, это работа для всех ????

person Sreekanth G    schedule 14.09.2020
comment
UIAlertAction не соответствует кодированию значения ключа для ключа attributeTitleForAction. - person konradowy; 24.09.2020
comment
@konradowy Что значит. я тебя не понял. Пожалуйста, объясните мне больше. - person Sreekanth G; 24.09.2020
comment
@SreekanthG Вы знаете, вы звоните applyNoActionBranding перед добавлением какого-либо действия. Вот почему вы не получили никакой ошибки. Он должен получить сообщение об ошибке несовместимости кодирования значения ключа для ключа attributeTitleForAction. - person Kevin; 28.10.2020

Попробуй это:

UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Do you wish to logout?" message:@"abcd" preferredStyle:UIAlertControllerStyleActionSheet];

NSMutableAttributedString *xyz = [[NSMutableAttributedString alloc] initWithString:@"pqrs"];

[xyz addAttribute:NSFontAttributeName
              value:[UIFont systemFontOfSize:30.0]
              range:NSMakeRange(20, 15)];
[alert setValue:xyz forKey:@"attributedTitle"];



UIAlertAction *logout = [UIAlertAction actionWithTitle:@"logout" 
                                        style:UIAlertActionStyleDefault
                                        handler:^(UIAlertAction *action){
                                                    //your code for handling this
}];
UIImage *Image = [UIImage imageNamed:@"yourImage"];
[logout setValue:accessoryImage forKey:@"image"];
person Suraj Sukale    schedule 10.06.2016
comment
@LianvanderVyver это приведет к сбою вашего приложения, если изображение, вероятно, слишком велико. Я исправил это, увеличив размер изображения, прежде чем установить его на ключевое изображение. - person Zonily Jame; 24.05.2017

Используйте NSMutableAttributedString, чтобы установить размер и цвет шрифта, используйте этот код ниже,

UIAlertController *controller = [UIAlertController alertControllerWithTitle:@"Do you wish to logout?" message:@"" preferredStyle:UIAlertControllerStyleAlert];

NSMutableAttributedString *hogan = [[NSMutableAttributedString alloc] initWithString:@"Do you wish to logout?"];

[hogan addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:50.0] range:NSMakeRange(24, 11)];

[hogan addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,35)];

[controller setValue:hogan forKey:@"attributedTitle"];

UIAlertAction *logOut = [UIAlertAction actionWithTitle:@"Log Out" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {}];

надеюсь, что это полезно

person Iyyappan Ravi    schedule 10.06.2016
comment
вопрос в том, чтобы обновить размер и цвет шрифта UIAlertAction. - person kaushal; 10.06.2016