tintColor UIActionSheet (или UIAlertView) (iOS 7+)

Возможно ли иметь кнопки в UIActionSheet в цвете tintColor iOS 7? Я имею в виду, что если мое приложение имеет бренд tintColor, например красный, мне не нужны синие кнопки в листе действий. То же самое с UIAlertView.


person user500    schedule 24.10.2013    source источник
comment
stackoverflow.com/questions/16713307/   -  person John Riselvato    schedule 25.10.2013
comment
Джон Рисельвато прав в ссылке на ответ: нет, ни UIAlertView, ни UIActionSheet не разработаны Apple для подкласса. Для пользовательского внешнего вида вам нужно свернуть свой собственный.   -  person ryan cumley    schedule 25.10.2013
comment
github.com/gloomcore/UICustomActionSheet   -  person Gloomcore    schedule 13.02.2014


Ответы (3)


Я хочу подчеркнуть, что это нарушает правила Apple, но это работает:

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet
{
    [actionSheet.subviews enumerateObjectsUsingBlock:^(UIView *subview, NSUInteger idx, BOOL *stop) {
        if ([subview isKindOfClass:[UIButton class]]) {
            UIButton *button = (UIButton *)subview;
            button.titleLabel.textColor = [UIColor greenColor];
            NSString *buttonText = button.titleLabel.text;
            if ([buttonText isEqualToString:NSLocalizedString(@"Cancel", nil)]) {
               [button setTitleColor:[UIColor greenColor] forState:UIControlStateNormal];
            }
        }
    }];
}

(соответствует UIActionSheetDelegate)

UIAlertView еще не пробовал.

person Adam Waite    schedule 11.02.2014
comment
Вы должны использовать следующий метод для обновления цвета заголовка кнопки: [button setTitleColor:[UIColor greenColor] forState:UIControlStateNormal]; - person Brody Robertson; 12.03.2014

Это возможно. Вот быстрая реализация для iOS7:

@interface LNActionSheet : UIActionSheet
{
    NSString* _destructiveButtonTitle;
    UIColor* _customtintColor;
}

@end

@implementation LNActionSheet

- (id)initWithTitle:(NSString *)title delegate:(id<UIActionSheetDelegate>)delegate cancelButtonTitle:(NSString *)cancelButtonTitle destructiveButtonTitle:(NSString *)destructiveButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ...
{
    self = [super initWithTitle:title delegate:delegate cancelButtonTitle:cancelButtonTitle destructiveButtonTitle:destructiveButtonTitle otherButtonTitles:nil];

    if(self)
    {
        va_list list;
        va_start(list, otherButtonTitles);

        for(NSString* title = otherButtonTitles; title != nil; title = va_arg(list, NSString*))
        {
            [self addButtonWithTitle:title];
        }

        va_end(list);

        _destructiveButtonTitle = destructiveButtonTitle;
    }

    return self;
}

- (void)setTintColor:(UIColor *)tintColor
{
    _customtintColor = tintColor;
}

-(void)tintColorDidChange
{
    [super tintColorDidChange];

    for(id subview in self.subviews)
    {
        if([subview isKindOfClass:[UIButton class]])
        {
            UIButton* button = subview;

            if(![button.titleLabel.text isEqualToString:_destructiveButtonTitle])
            {
                [button setTitleColor:_customtintColor forState:UIControlStateNormal];
            }
        }
    }
}

@end

Перед показом установите цвет оттенка листа действий по своему вкусу.

В этой реализации я решил оставить заголовок деструктивной кнопки красным, но это можно изменить.

person Leo Natan    schedule 24.10.2013

Пожалуйста, посмотрите на мой дочерний класс UICustomActionSheet. Я только что добавил последние изменения, которые позволяют правильно отображать стили для дизайна iOS6 и iOS7. https://github.com/gloomcore/UICustomActionSheet

Вы можете установить цвета, шрифты, цвета текста, а также изображения для каждой кнопки. Отлично работает как для iPhone, так и для iPad. Компонент абсолютно безопасен для Appstore, поэтому вы можете использовать его в своих приложениях. Наслаждаться!

person Gloomcore    schedule 12.02.2014