2013-12-04 1 views
2

Я хотел бы изменить цвет моей навигационной панели с анимацией.Цвет перехода

Я пробовал CATransition, но я не могу найти, как изменить цвет с этим.

Есть ли способ изменить цвет с затуханием или любой другой анимацией? Как TransitionDrawable в Android.

Спасибо.

+0

возможного дубликат [UINavigationBar изменения Оттенок цвета с анимацией] (http://stackoverflow.com/questions/ 5042283/uinavigationbar-change-tint-color-with-animation) –

+0

В iOS7 цвет панели навигации изменяется ** всегда ** анимированный. Если вы просто установите цвет в коде, будет плавная анимация, возможно, 0,5 с. – Marc

+0

Я уже прочитал этот пост, но я не прочитал второй пост, объяснив, что невозможно изменить цвет фона ... – Pull

ответ

3

Я пробовал кое-что и, наконец, получил это решение. Он не нуждается в дополнительных слоях, изображениях или переходах и использует встроенную анимацию бара.

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

Это проверено 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; 
      }]; 
     }); 
    } 
} 

Минус: Это не маслянистое гладкая :(

+0

Послушный, вы дали мой ответ, который мне нужен, barTinTColor может быть анимированным! Но мне просто нужен этот код: self.navigationController.navigationBar.barTintColor = [UIColor redColor]; [UIView animateWithDuration: 5.0f анимации:^{ self.navigationController.navigationBar.barTintColor = [UIColor blueColor]; } завершение:^(BOOL завершено) { }]; – Pull

+0

Вы уверены, что вам не нужно больше? Независимо от того, какое значение вы выберете для продолжительности, внутренне оно всегда будет одинаковым. Вот почему я создал цикл анимации. – Marc

+0

UIView animateWithDuration сделать анимацию для вас, вам не нужен цикл анимации. Но я использовал backgroundColor вместо barTinTColor, это мой мистик. – Pull

0

Ваш fading просто означает изменение альфа Панель навигации, см этот код:

if ([self.navigationController.navigationBar respondsToSelector:@selector(setBarTintColor:)]) { 
    [self.navigationController.navigationBar setBarTintColor:[UIColor blueColor]]; 
} else { 
    self.navigationController.navigationBar.tintColor = [UIColor blueColor]; 
} 

self.navigationController.navigationBar.alpha = 0.f; 
[UIView animateWithDuration:.2f animations:^{ 
    self.navigationController.navigationBar.alpha = 1.f; 
} completion:^(BOOL finished) { 
    // 
}]; 
+0

Я уже пробовал это, но с альфой переход начинается с черного, я хочу, чтобы переход начинался с цвета и заканчивался другим.И мое золото должно изменить только фон, а не весь navBar с логотипом в нем. Но спасибо за ваш ответ. – Pull

0

я найти решение, которое я объясню здесь.

Поскольку мы не можем изменить атрибут backgroundColor, нам понадобится трюк, чтобы сделать анимацию для изменения цвета navBar с анимацией.

Я выбираю, чтобы поставить выше мой navBar идентичный подкласс с CATransition.

CGRect frame = self.navigationController.navigationBar.frame; 
UIView *view = [[UIView alloc] initWithFrame:frame]; 
[view setBackgroundColor:[UIColor redColor]]; 
UIImageView *logo = [[UIImageView alloc] initWithFrame:CGRectMake(77,3,163,38)]; 
[logo setImage:[UIImage imageNamed:@"icon_transparent.png"]]; 
[view addSubview:logo]; 

CATransition *myAnimationView = [CATransition animation]; 
[myAnimationView setDuration:1.5f]; 
[myAnimationView setType:kCATransitionReveal]; 
[myAnimationView setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]]; 
[[view layer] addAnimation:myAnimationView forKey:kCATransitionReveal]; 
[self.navigationController.navigationBar addSubview:view]; 
+0

Найти лучший способ анимации атрибута barTinTColor of navBar – Pull