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

Как мне настроить tintColor на серый на настраиваемом элементе управления, когда лист/предупреждение отображается в iOS 7?

В iOS 7, когда представлен a UIActionSheet, система управляет всеми анимированными символами tintColor до серого. Когда лист отклоняется, они оживают назад.

У меня есть некоторые элементы управления с пользовательскими фоновыми изображениями или реализацией drawRect, которые используют цвет оттенков, и я хотел бы, чтобы они отображали это изменение так же, как и системные элементы управления.

Apple добавила - (void)tintColorDidChange в UIView, но перерисовка с новым цветом в этом методе не изменяет это изменение - он сразу переключается с полного цвета на полный серый, что плохо выглядит, когда другие элементы системы вокруг него оживляющий.

Как я могу сделать свои настраиваемые элементы управления анимацией перехода tintColor, например, Apple?

4b9b3361

Ответ 1

Вы можете сделать это с помощью перехода на базовую анимацию, применяемого к слою представления:

//set up transition
CATransition *transition = [CATransition animation];
transition.type = kCATransitionFade;
transition.duration = 0.4;
[self.layer addAnimation:transition forKey:nil];

//now trigger a redraw of the background using the new colour
//and the transition will cover the redraw with a crossfade
self.flagToIndicateColorShouldChange = YES;
[self setNeedsDisplay];

ИЗМЕНИТЬ: может быть состояние гонки между анимацией и перерисовкой в ​​зависимости от того, как именно вы выполняете перерисовку. Если вы можете опубликовать исходный код перерисовывания, который вы пытались обновить сразу (без анимации), я могу предоставить более конкретный ответ.

Ответ 2

Не следует ли автоматически вызывать drawRect: для обновления анимации для нового tintColor?

Я сделал демонстрационное приложение, которое имеет три элемента управления в главном контроллере. Первая - это кнопка, которая отображает стандартный лист действий. Вторая кнопка - это кнопка для наблюдения (нажатая кнопка трудно сравнивать с анимацией). Третий - это пользовательский подкласс UIView, который просто рисует прямоугольник вида tintColor. Когда вызывается tintColorDidChange, я вызываю setNeedsDisplay, который, в свою очередь, вызывает drawRect:.

Я создал новое приложение с одним контроллером представления:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [[UIApplication sharedApplication] keyWindow].tintColor = [UIColor blueColor];

    // Button to bring up action sheet
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = (CGRect){10,30,300,44};
    [button setTitle:@"Present Action Sheet" forState:UIControlStateNormal];
    [button addTarget:self
               action:@selector(didTapPresentActionSheetButton:)
     forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];

    // Another button for demonstration
    UIButton *anotherButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    anotherButton.frame = (CGRect){10,90,300,44};
    [anotherButton setTitle:@"Another Button" forState:UIControlStateNormal];
    [self.view addSubview:anotherButton];

    // Custom view with tintColor
    TESTCustomView *customView = [[TESTCustomView alloc] initWithFrame:(CGRect){10,150,300,44}];
    [self.view addSubview:customView];
}

- (void)didTapPresentActionSheetButton:(id)sender
{
    UIActionSheet *as = [[UIActionSheet alloc] initWithTitle:@"Action Sheet"
                                                    delegate:nil
                                           cancelButtonTitle:@"Cancel"
                                      destructiveButtonTitle:@"Delete"
                                           otherButtonTitles:@"Other", nil];
    [as showInView:self.view];
}

где TESTCustomView является подклассом UIView с реализацией следующим образом:

- (void)drawRect:(CGRect)rect
{
    NSLog(@"Drawing with tintColor: %@", self.tintColor);

    // Drawing code
    [super drawRect:rect];

    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(c, self.tintColor.CGColor);
    CGContextFillRect(c, rect);
}

- (void)tintColorDidChange
{
    [self setNeedsDisplay];
}

Запуск этого приложения в симуляторе показывает, что пользовательский вид tintColor автоматически анимируется со стандартными экземплярами UIButton в контроллере представления.

Ответ 3

Вы пробовали tintAdjustmentMode?

Вы должны посмотреть WWDC 2013 Session 214 Настройка внешнего вида приложений для iOS 7 и прочитать демо-приложение TicTacToe

Что-то вроде этого

- (void)onPopupOpened
{
    [UIView animateWithDuration:0.3 animations:^{
        window.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
    }];

    popupView.tintAdjustmentMode = UIViewTintAdjustmentModeNormal;
    popupView.tintColor = [UIColor redColor];
}

- (void)onPopupClosed
{
    [UIView animateWithDuration:0.3 animations:^{
        window.tintAdjustmentMode = UIViewTintAdjustmentModeAutomatic;
    }];
}