如下图所示,Twitter为每个被推送的视图控制器使用不同的导航栏颜色。
我几乎尝试了所有东西(setbackgroundimage,backgroundcolor,bartintcolor等),但似乎没有任何效果。我认为Twitter使用自定义转换来模拟推送,因为,在我看来,每个视图控制器都有自己的导航栏和自己的颜色。
答案 0 :(得分:4)
如果您想使用不同的navigationBar
来处理barTintColor
,代码学校会有一个关于它的教程。 (iOS App: Creating a Custom Nav Bar)
它也可以使用setBackgroundImage:forBarMetrics:
方法扩展到不同的背景。
有以下四个步骤:
在源视图控制器的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];
}
在目标视图控制器的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];
}
填写backTapped:
方法,以便用户可以从目标视图控制器点击弹出窗口。
- (void)backTapped:(id)sender
{
[self.navigationController popViewControllerAnimated:YES];
}
考虑到从滑动到弹出的情况,将手势识别器的委托设置为目标视图控制器的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:
您可以使用空图像设置原始导航栏背景:
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
使用此视图层次结构中的所有其他VC将采用透明导航栏。
在另一个VC中如果要设置自定义图像或自定义颜色,只需将背景视图放在导航栏的位置,这在视图中确实加载了特定视图控制器的方法。
let viewNavBar = UIView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 64))
viewNavBar.backgroundColor = UIColor.white
view.addSubview(viewNavBar)
使用此功能,您可以在viewNavBar中设置任何背景或图像,而不会弄乱导航栏的整体配置。
答案 3 :(得分:0)
尝试查看此GitHub回购,我认为它可以帮助您实现这种效果https://github.com/kingiol/KDInteractiveNavigationController