UINavigationController总结

UINavigationController 相关的内容

参考链接 写的挺好的 清晰 参考链接也都列出来了
参考链接

UINavigationController继承自UIViewController
属于容器类的VC,管理VC的方式遵从栈的管理原则

包括几个部分

  • Navigation toolbar
  • Custom content
  • Navigation bar
  • Navigation view

UINavigationController总结

Item部分

nav上的标题,按钮返回按钮 right按钮这些东西
通过self.navitem修改 每个被push进Nav的VC对应一个item

bar部分

只有一个,他属于UINavigationController(只有一份),是所有UIViewController公用的。所以,当你修改了UINavigationBar的背景图片或者颜色时,相当于修改了所有UIViewController的NavigationBar的背景图片或颜色。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-plv6Bsre-1620105698316)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/394c869c58aa437ba0831046e5b0b58a~tplv-k3u1fbpfcp-watermark.image)]

UINavigationController、UINavigationBar、UINavigationBarItem 联系和区别

UINavigationCOntroller是ViewCOntroller的子类,他有一个属性是ViewControllers,是一个容器类,可以装很多的VC,通过UINavigationBar来管理这些VCs,bar是UIview的子类,但是一个容器就一个Bar,Bar主要负责导航条的颜色背景图等,每个被管理的VC对应一个UINaviagtionBarItem,通过item可以控制改变bar上的标题,按钮等

也就是说UINavigationController是由UINavigationBar组成,UINavigationBar分为两部分第一部分是UINavigationController独有的共享给每个VC使用,第二部分是UINavigationBarItem每个被管理的VC都有一个Item,VC通过Item控制Bar上显示的标题 按钮 等信息。

其他

UINavigationBar的高度是44

设置prompt属性后高度增加30
文档对这个属性的解释是
A single line of text that displays at the top of the navigation bar.

UINavigationController总结

wantsFullScreenLayout

viewController的一个属性,这个属性默认值是NO,如果设置为YES的话,如果statusbar,navigationbar, toolbar是半透明的话,viewController的view就会缩放延伸到它们下面,但注意一点儿tabBar不在范围内,即无论该属性是否为YES,view都不会覆盖到tabbar的下方。

navigationBar的刷新

通过前面介绍的内容,我们知道navigationBar中包含了这几个重要组成部分:leftBarButtonItem, rightBarButtonItem, backBarButtonItem, title。当一个view controller添加到navigationController以后,navigationBar的显示遵循一下几个原则:

1)、Left side of the navigationBar

a)如果当前的viewController设置了leftBarButtonItem,则显示当前VC所自带的leftBarButtonItem。

b)如果当前的viewController没有设置leftBarButtonItem,且当前VC不是rootVC的时候,则显示前一层VC的backBarButtonItem。如果前一层的VC没有显示的指定backBarButtonItem的话,系统将会根据前一层VC的title属性自动生成一个back按钮,并显示出来。

c)如果当前的viewController没有设置leftBarButtonItem,且当前VC已是rootVC的时候,左边将不显示任何东西。

此处注意:5.0中新增加了一个属性leftItemsSupplementBackButton,通过指定该属性为YES,可以让leftBarButtonItem和backBarButtonItem同时显示,其中leftBarButtonItem显示在backBarButtonItem的右边。

2)、title部分

a)如果当前VC通过 .navigationItem.titleView指定了自定义的titleView,系统将会显示指定的titleView,此处要注意自定义titleView的高度不要超过navigationBar的高度,否则会显示出界。

b)如果当前VC没有指定titleView,系统则会根据当前VC的title或者当前VC的navigationItem.title的内容创建一个UILabel并显示,其中如果指定了navigationItem.title的话,则优先显示navigationItem.title的内容。

3)、Right side of the navigationBar

a)如果当前VC指定了rightBarButtonItem的话,则显示指定的内容。

b)如果当前VC没有指定rightBarButtonItem的话,则不显示任何东西。

delegate

// Called when the navigation controller shows a new top view controller via a push, pop or setting of the view controller stack.
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated;

UINavigationController的viewControllers属性

通过该属性我们可以实现一次性替换整个navigationController的层次, 这个过程如果通过setViewControllers:animated:来设置,并指定动画为YES的画,动画将会从当前的navigationController所显示的vc跳转到所设置的目标viewController的最顶层的那个VC,而中间其他的VC将会被直接从VC层级中移除和添加进来(没有动画)。

topViewController Vs visibleViewController

topViewController代表当前navigation栈中最上层的VC,而visibleViewController代表当前可见的VC,它可能是topViewController,也可能是当前topViewController present出来的VC。因此UINavigationController的这两个属性通常情况下是一样,但也有可能不同。

上一篇:【快评】今年必定是存储VC最少的一年,与其坐着等死,不如抱团取暖


下一篇:VC数据类型的等效性