Как поменять barTintColor без анимации на iOS7?

На iOS7 мы можем изменить цвет панели навигации

self.navigationController.navigationBar.barTintColor = [UIColor redColor];

Но этот метод имеет затухающую анимацию при изменении barTintColor. Так кто-нибудь знает, как предотвратить эту анимацию и немедленно изменить цвет?

Чтобы быть более конкретным, я написал тестовую программу, корневым контроллером окна которой является navigationController. А в навигационном контроллере есть контроллер вида с 3 кнопками. Все 3 кнопки связаны со следующим действием:

- (void)onClick:(id)sender
{
    UIColor *color = nil;
    if (sender == self.redButton)
    {
        color = [UIColor redColor];
    }
    else if (sender == self.blueButton)
    {
        color = [UIColor blueColor];
    }
    else if (sender == self.blackButton)
    {
        color = [UIColor blackColor];
    }

    self.navigationController.navigationBar.barTintColor = color

//    [UIView animateWithDuration:0 animations:^{
//        self.navigationController.navigationBar.barTintColor = color;
//    }];

//    [CATransaction begin];
//    [CATransaction setDisableActions:YES];
//    self.navigationController.navigationBar.barTintColor = color;
//    [CATransaction commit];

}

И изменение длительности анимации до 0 или использование [CATransaction setDisableActions:YES] не работает, анимация все еще существует.

Надеюсь, что кто-то может помочь, спасибо!

4 ответа

Попробуйте установить barTintColor на ноль, прежде чем устанавливать его снова.

self.navigationController.navigationBar.barTintColor = nil;
self.navigationController.navigationBar.barTintColor = color;

У меня была похожая проблема, и она исправила ее для меня. Надеюсь, поможет.

Задавать translucent собственность на UINavigationBar в NO, затем сбросьте его после изменения оттенка

self.navigationBar.translucent = NO;
self.navigationBar.barTintColor = [UIColor magentaColor];
self.navigationBar.translucent = YES;

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

[CATransaction begin];
[CATransaction setDisableActions: YES];

self.navigationItem.leftBarButtonItem.tintColor = [UIColor colorWithRed:125.0/255.0 green:90.0/255.0 blue:146.0/255.0 alpha:1];

[CATransaction commit];

Эта техника работает для любой неявной анимации. Неявная анимация - это анимация, созданная для вас iOS при изменении свойства анимации. Смотрите здесь для более подробной информации:

https://developer.apple.com/library/ios/documentation/cocoa/conceptual/coreanimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html

Попробуй с

[UIView animateWithDuration:0 animations:^{
        self.navigationController.navigationBar.barTintColor = [UIColor redColor];
}];
Другие вопросы по тегам