过渡UINavigationBar颜色?

时间:2009-03-14 02:43:36

标签: iphone cocoa-touch

我基本上试图在iPhone上复制iPod应用程序的行为,当您选择一首歌曲时,音乐播放器视图会滑入,导航栏会转换为新颜色。

我的应用程序设置为基于标签的应用程序,每个标签中都有UITabBarController和嵌套UINavigationController。每个选项卡的每个UINavigationController内都有一个UITableView。当我在表格中选择一个项目时,我正在使用pushViewController滑动到下一个视图,并且我已在下一个视图控制器中设置hidesBottomBarWhenPushed以便将标签滑开。这种行为非常接近iPod“正在播放”页面,这几乎是完美的。

最后一个问题是我无法转换导航栏的颜色,就像iPod应用程序中的导航栏从蓝色变为黑色一样。我可以在新视图出现后强制更改颜色(在viewWillAppear中),但更改是突然的,并且不会模仿iPod应用程序的行为,具有淡入淡出效果。

有谁知道我在这里缺少什么?它似乎是一个非常简单和常见的UI,我在几个应用程序中看到过,但似乎没有一个明显的方法来做到这一点。

3 个答案:

答案 0 :(得分:8)

安德鲁的答案实际上运作得很好,但我会添加两件事来让它更好地运作:

  1. 通过类别而不是子类提供功能。更不用说了。
  2. 仅在绝对必要时使用转换。这样做的原因是,当使用这种技术时,原始的标题文本会消失,而不是从侧面滑落。它是微妙的,但如果它发生在酒吧风格实际上没有变化的过渡期间会更加明显。所以我避免这种情况。
  3. 这是我的类别代码(我在UINavigationBar和UIToolbar的类别中都有它):

    - (void)setBarStyle:(UIBarStyle)barStyle animated:(BOOL)animated {
        if (animated && self.barStyle != barStyle) {
            CATransition *transition = [CATransition animation];
            transition.duration = 0.2;
            transition.timingFunction = [CAMediaTimingFunction
                functionWithName:kCAMediaTimingFunctionEaseIn];
            [self.layer addAnimation:transition forKey:nil];
        }
    
        [self setBarStyle:barStyle];
    }
    

    这就是我使用它的方式:

    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
    
        [[UIApplication sharedApplication]
            setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];
        [self.navigationController.navigationBar
            setBarStyle:UIBarStyleBlackTranslucent animated:YES];
        [self.navigationController.toolbar
            setBarStyle:UIBarStyleBlackTranslucent animated:YES];
    }
    

答案 1 :(得分:3)

您可以设置状态栏样式更改的动画,以创建非常接近的效果。

- (void)viewWillAppear:(BOOL)animated {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:animated];
    self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
}

您已经注意到导航栏样式会立即更改,但状态栏的动画更改仍会提供转换的整体外观。

答案 2 :(得分:2)

我做了一个可能更符合您需求的解决方案。

  • 创建UINavigationBar
  • 的自定义子类
  • 按如下方式覆盖setBarStyle:

代码:

- (void)setBarStyle:(UIBarStyle)style {
    //Fade our content, ie background, from one style to another
    CATransition *transition = [[CATransition new] autorelease];
    transition.type = kCATransitionFade;
    transition.duration = 0.2;
    [self.layer addAnimation:transition forKey:@"content"];

    [super setBarStyle:style];
}
  • 配置您的导航控制器以使用此子类
    • 在IB中,您只需在检查器中设置类
    • 即可