一些关于iOS系统导航栏与自定义导航栏的事情

  1. 关于系统导航栏是真的让人又爱又恨,爱的是苹果本身对这个控件的封装已经是很完美了,包括内存、美化、渐变动画等等,一般来说,基本上所有需求都可以满足的。但是你要知道什么东西到了中国,就会发生翻天覆地的变化,例如后台的数据并发。在国内奇葩的产品设计之下,导航栏也是面目全非,反正我看了比较著名的APP,发现他们的导航栏基本都是自定义,其中牵扯最大的问题就是导航栏自身的隐藏、颜色渐变。
  2. 其实通过APP运行时,你可以看到系统NavigationBar的分层。一个navigationBar是分很多层的,并非我们看到的最外层,它里面有控制颜色的层,有放置控件的navigationItem层等等,有兴趣的可以通过xcode的Debug Navigator--->View UI Hierarchy,类似于Reveal这个工具。
  3. 系统的导航栏不多说,因为当你用到自定义导航栏时,基本上就是你们产品的需求,系统的导航栏已经满足不了,或者说满足起来极其麻烦。我前段时间也是遇到一个这样纠结的产品需求,首页导航栏隐藏,后面界面有些隐藏,有些不隐藏,这时为了防止Push/POP滑动动画时导航栏产生黑条,需要进行一系列的设置,极其麻烦。至于为什么会这样,在这解释下,因为当你设置了navigationController之后,在这个栈中是始终只存在一个navigationController的。同时,navigationBar也是始终只有一个,但是为什么每个界面的导航栏可以放置不同的控件呢?那是因为放置控件的navigationItem是每个界面都会初始化的,再次赞美下苹果工程师的机智,但这样就会导致一个问题,不同界面的生命周期会在ViewWillAppear和ViewWillDisappear中产生交汇,这时系统的navigationBar就会受到影响。这就是为什么你在设置不同控件时,系统navigationBar看起来是正常的,但是你一动navigationBar的透明度、颜色就会出来各种问题的原因。
  4. 基于上面那个原因,我自定义了navigationBar和navigationItem。刚开始,我将自定义的naviBar和naviItem放置在UINavigationController的category中,后来我发现因为系统的navigationController在一个栈中,是只初始化一次的,这导致每次Push之后的界面的naviBar将会覆盖上一个界面的,导致在返回以后无法再对上一个界面的naviBar进行操作,我想性系统可能是通过某种方式记录了,但我还不太清楚。所以我只能退而求其次将其放置在了UIViewController的category中,这样算是完美解决了这些问题。
  5. 项目下载地址https://github.com/jizhidejingmo/YYNavigationBar
时间: 2024-07-30 03:02:07

一些关于iOS系统导航栏与自定义导航栏的事情的相关文章

实际iOS编程中遇到的自定义导航栏按钮,导致手势返回失效的解决方法

1\在实际编程过程中往往需要自定义导航栏上面的按钮,也就用: - (instancetype)initWithCustomView:(UIView *)customView; 但用了这个方法后可能会导致iOS7,8的手势返回失效,解决方法就是在自定义的导航栏的viewDidLoad方法中添加如下代码 注意:只有用系统的导航栏,或者继承于系统的导航栏才可以用Push方法,并且自带返回手势. - (void)viewDidLoad { [super viewDidLoad]; __weak type

导航控制器和自定义导航控制器

导航控制器appDelegateViewController * vc = [[ViewController alloc] init];    UINavigationController * nav = [[UINavigationController alloc] initWithRootViewController:vc];    self.window.rootViewController = nav; 具体在ViewController中设置    //设置标题    self.tit

ios 导航栏(自定义和使用系统方式)

系统方式: //1.设置导航栏背景图片 [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = [[UIImage alloc]init]; [[self navigationController] setNa

iOS 自定义导航栏笔记

一.UINavigationBar的结构 导航栏几乎是每个页面都会碰到的问题,一般两种处理方式:1.隐藏掉不显示 2.自定义 1. 添加导航栏 TestViewController * mainVC = [[TestViewController alloc] init]; UINavigationController * nav = [[UINavigationController alloc] initWithRootViewController:mainVC]; self.window.ro

IOS 自定义导航栏标题和返回按钮标题

IOS中自定义导航栏标题: UILabel *titleText = [[UILabel alloc] initWithFrame: CGRectMake(160, 0, 120, 50)]; titleText.backgroundColor = [UIColor clearColor]; titleText.textColor=[UIColor whiteColor]; [titleText setFont:[UIFont systemFontOfSize:17.0]]; [titleTex

ios 自定义导航栏和分割线

自定义导航栏: // CustomNaviBarView.h #import <UIKit/UIKit.h> @interface CustomNaviBarView : UIView { @private /** * 左侧按钮 */ UIButton* _leftButton; /** * 右侧按钮 */ UIButton* _rightButton; /** * 中部标签 */ UILabel* _navTitle; } @property(nonatomic,strong)UIButto

iOS不得姐项目--appearance的妙用,再一次设置导航栏返回按钮,导航栏左右按钮的封装(巧用分类)

一.UI_APPEARANCE_SELECTOR 彩票项目中appearance的用法一直没有搞明白,这次通过第二个项目中老师的讲解,更深一层次的了解到了很多关于appearance的作用以及使用方法. 在iOS属性后有UI_APPEARANCE_SELECTOR标志都可以一次性统一设置.这种情况还有很多.比如说统一设置UITabbarItem的文字颜色 通过appearance来同意设置属性最好是在+ (void)initialize;方法里面. 项目中设置导航栏背景图片的代码: 项目中设置T

自定义导航栏返回时的滑动手势处理

现在使用默认模板创建的iOS App都支持手势返回功能,如果导航栏的返回按钮是自定义的那么则会失效,也可以参考这里手动设置无效. if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enabled = NO; } 如果是因为自定义导航按钮而导

iOS开发&gt;学无止境 - 自定义导航按钮UIBarButtonItem

基本上每个iOS APP里面都有导航,比如微信.QQ.支付宝.导航可以很方便地帮助我们管理视图控制器(UIViewController).导航的重要性不言而喻,基本上是每一位iOS初学者都要接触到的问题. iOS系统导航栏中有leftBarButtonItem和rightBarButtonItem,我们可以根据自己的需求来自定义这两个UIBarButtonItem. 四种创建方法 系统提供了四种创建的方法: - (instancetype)initWithBarButtonSystemItem: