导航栏在每个视图控制器中都有不同的颜色,如Twitter(不是setbartintcolor)

时间:2014-09-30 23:11:14

标签: ios uinavigationcontroller uinavigationbar custom-transition

如下图所示,Twitter为每个被推送的视图控制器使用不同的导航栏颜色。

我几乎尝试了所有东西(setbackgroundimage,backgroundcolor,bartintcolor等),但似乎没有任何效果。我认为Twitter使用自定义转换来模拟推送,因为,在我看来,每个视图控制器都有自己的导航栏和自己的颜色。

enter image description here enter image description here

4 个答案:

答案 0 :(得分:4)

如果您想使用不同的navigationBar来处理barTintColor代码学校会有一个关于它的教程。 (iOS App: Creating a Custom Nav Bar) 它也可以使用setBackgroundImage:forBarMetrics:方法扩展到不同的背景。

有以下四个步骤:

  1. 在源视图控制器的viewWillAppear处理此操作,隐藏navigationBar提供的navigationController并为navigationBar创建新的superView

    - (void)styleNavBar
    {
        // 1. hide the existing nav bar
        [self.navigationController setNavigationBarHidden:YES animated:NO];
    
        // 2. create a new nav bar and style it
        UINavigationBar *newNavBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), 64.0)];
        [newNavBar setTintColor:[UIColor whiteColor]];
    
        // 3. add a new navigation item w/title to the new nav bar
        UINavigationItem *newItem = [[UINavigationItem alloc] init];
        newItem.title = @"Source";
        [newNavBar setItems:@[newItem]];
    
        // 4. add the nav bar to the main view
        [self.view addSubview:newNavBar];
    }
    
  2. 在目标视图控制器的viewWillAppear中执行相同的操作,并创建backBarButtonItem作为新的navigationBar' s leftBarButtonItem

    - (void)styleNavBar 
    {
        [self.navigationController setNavigationBarHidden:YES animated:NO];
        UINavigationBar *newNavBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), 64.0)];
        [newNavBar setTintColor:[UIColor blueColor]];
        UINavigationItem *newItem = [[UINavigationItem alloc] init];
        newItem.title = @"Destination";
    
        // BackButtonBlack is an image we created and added to the app’s asset catalog
        UIImage *backButtonImage = [UIImage imageNamed:@"BackButtonBlack"];
    
        // any buttons in a navigation bar are UIBarButtonItems, not just regular UIButtons. backTapped: is the method we’ll call when this button is tapped
        UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithImage:backButtonImage
                                                                              style:UIBarButtonItemStylePlain
                                                                             target:self
                                                                             action:@selector(backTapped:)];
    
        // the bar button item is actually set on the navigation item, not the navigation bar itself.
        newItem.leftBarButtonItem = backBarButtonItem;
    
        [newNavBar setItems:@[newItem]];
        [self.view addSubview:newNavBar];
    }
    
  3. 填写backTapped:方法,以便用户可以从目标视图控制器点击弹出窗口。

    - (void)backTapped:(id)sender
    {
        [self.navigationController popViewControllerAnimated:YES];
    }
    
  4. 考虑到从滑动到弹出的情况,将手势识别器的委托设置为目标视图控制器的self中的viewWillAppear(作者:这里的解决方案有点像黑客。)

    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        [self styleNavBar];
    
        __weak id weakSelf = self;
        self.navigationController.interactivePopGestureRecognizer.delegate = weakSelf;
    }
    

答案 1 :(得分:2)

Twitter无法更改导航栏颜色。当您查看用户的个人资料时,它是用户封面照片的模糊版本。

正如您在转换中看到的那样,整个用户个人资料视图将替换上一个视图。导航栏不会更改,它会被替换。他们甚至可能不使用UINavigationBar(或者至少不是导航控制器中的那个)。

" bar"是一个自定义视图,显示用户的封面照片,背面/搜索/推文按钮出现在他们通常的位置。当您向下滚动时,用户的封面照片会缩小,模糊并附着到屏幕顶部 - 此时,它看起来像一个普通的导航栏。此时,用户的姓名和推文计数也会向上滚动到导航栏的中心。

它非常有趣,而且用户个人资料的整个视图结构可能会使用一堆技巧。但是,模仿他们的个人资料视图并不是一项简单的任务,他们所做的远不止改变导航栏的色彩。如果你只是想这样做,撤销的答案很有效。但是,您可能还需要在viewWillAppear方法(旧视图和新视图)中重置色调颜色。

答案 2 :(得分:2)

这适用于swift3:

  1. 您可以使用空图像设置原始导航栏背景:

    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
    
  2. 使用此视图层次结构中的所有其他VC将采用透明导航栏。

  3. 在另一个VC中如果要设置自定义图像或自定义颜色,只需将背景视图放在导航栏的位置,这在视图中确实加载了特定视图控制器的方法。

    let viewNavBar = UIView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 64))
    viewNavBar.backgroundColor = UIColor.white
    view.addSubview(viewNavBar)
    
  4. 使用此功能,您可以在viewNavBar中设置任何背景或图像,而不会弄乱导航栏的整体配置。

答案 3 :(得分:0)

尝试查看此GitHub回购,我认为它可以帮助您实现这种效果https://github.com/kingiol/KDInteractiveNavigationController