iOS 开发实战小知识(七) —— UINavigationBar相关

206 阅读1分钟

1.导航相关

// 设置一个空的背景图片,实现导航栏透明但是 BarButtonItem 正常显示 [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];

// 设置一个空的 shadowImage 来去掉NavigationBar 最下面的那条线 self.navigationController.navigationBar.shadowImage = [UIImage new];

//随着上拉距离的改变,实现其透明度动态变化 // 实现:监听 scrollView 的 offset值,然后获取到 NavigationBar的子控件,动态改变其透明度

[[self.navigationController.navigationBar subviews] objectAtIndex:0].alpha = 0;

2.奇葩需求

有个需求是A push 到 B, B push 到 C, C “pop” 到 D,D 再 “pop” 到 A, 傻逼不???

//实现吧:首先 A push 到 B

[self.navigationController pushViewController:B animated:YES];
//此时 self.navigationController.childViewControllers = [A, B];

//然后 B push 到 C

[self.navigationController pushViewController:C animated:YES];
// 此时 self.navigationController.childViewControllers = [A, B, C];

//现在要实现 C pop 到 D,由于navigationController.childViewControllers是只读的,因此不能直接对其进行操作。。。

// 这时候可建立可变拷贝对象,然后进行替换操作,是不是很聪明啊 😆

NSMutableArray *navChildMuarr = [self.navigationController.childViewControllers mutableCopy];
[navChildMuarr replaceObjectAtIndex:1 withObject:D];

// 最后再将替换后的数组赋值回去不要忘了

[self.navigationController setViewControllers:navChildMArr animated:YES];

备注:上面这串代码:写在 B push C 之后或者写在 C 的 viewDidLoad() 方法中也可以