Я пробовал кое-что и, наконец, получил это решение. Он не нуждается в дополнительных слоях, изображениях или переходах и использует встроенную анимацию бара.
Поэтому он не скрывает никаких названий и кнопок на панели, которые вы разместили на панели навигации. Если панель навигации находится ниже строки состояния, цвет строки состояния также будет изменен.
Это проверено iOS7, как для имитатора, а также реального устройства (IPad)
Код:
Прямо под ваш импорт делает
#define STEP_DURATION 0.01
Вы можете играть с это значение для более плавной анимации
Это метод, который вы хотите назвать
[self animateNavigationBarFromColor:[UIColor greenColor] toColor:[UIColor blueColor] duration:2.5];
Параметры должны быть самообучающимися (продолжительность в секундах).
И это фактический код
- (void)animateNavigationBarFromColor:(UIColor *)fromColor toColor:(UIColor *)toColor duration:(NSTimeInterval)duration
{
NSUInteger steps = duration/STEP_DURATION;
CGFloat fromRed;
CGFloat fromGreen;
CGFloat fromBlue;
CGFloat fromAlpha;
[fromColor getRed:&fromRed green:&fromGreen blue:&fromBlue alpha:&fromAlpha];
CGFloat toRed;
CGFloat toGreen;
CGFloat toBlue;
CGFloat toAlpha;
[toColor getRed:&toRed green:&toGreen blue:&toBlue alpha:&toAlpha];
CGFloat diffRed = toRed - fromRed;
CGFloat diffGreen = toGreen - fromGreen;
CGFloat diffBlue = toBlue - fromBlue;
CGFloat diffAlpha = toAlpha - fromAlpha;
NSMutableArray *colorArray = [NSMutableArray array];
[colorArray addObject:fromColor];
for (NSUInteger i = 0; i < steps - 1; ++i) {
CGFloat red = fromRed + diffRed/steps * (i + 1);
CGFloat green = fromGreen + diffGreen/steps * (i + 1);
CGFloat blue = fromBlue + diffBlue/steps * (i + 1);
CGFloat alpha = fromAlpha + diffAlpha/steps * (i + 1);
UIColor *color = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
[colorArray addObject:color];
}
[colorArray addObject:toColor];
[self animateWithArray:colorArray];
}
- (void)animateWithArray:(NSMutableArray *)array
{
NSUInteger counter = 0;
for (UIColor *color in array) {
double delayInSeconds = STEP_DURATION * counter++;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[UIView animateWithDuration:STEP_DURATION animations:^{
self.navigationController.navigationBar.barTintColor = color;
}];
});
}
}
Минус: Это не маслянистое гладкая :(
возможного дубликат [UINavigationBar изменения Оттенок цвета с анимацией] (http://stackoverflow.com/questions/ 5042283/uinavigationbar-change-tint-color-with-animation) –
В iOS7 цвет панели навигации изменяется ** всегда ** анимированный. Если вы просто установите цвет в коде, будет плавная анимация, возможно, 0,5 с. – Marc
Я уже прочитал этот пост, но я не прочитал второй пост, объяснив, что невозможно изменить цвет фона ... – Pull