概念 UINavigationController 继承于 UIViewController 包含:viewcontrollers、NavigationBar、Toolbar 导航控制器是一个堆栈结构,...(通过navigationController. navigationBar方式可以调用) NavigationBar管理多个NavigationItem,和NavigationController一样都是用...*topViewController; 2、获取当前界面显示的controller @property(nullable, nonatomic,readonly,strong) UIViewController...animated:(BOOL)animated; 3、管理视图控制器操作 (1)压入新的视图控制器 - (void)pushViewController:(UIViewController *)viewController...继承该父类的控制器调用此方法都可以隐藏push来的控制器底部的TabBar - (void)pushViewController:(UIViewController *)viewController animated
1.导航栏的显示与隐藏 导航栏的显示与隐藏,分两种情况: 1.从不显示导航栏的页面push到显示导航栏的页面。 2.从显示导航栏的页面Push到不显示导航栏的页面。...针对以上两种情况分别处理,整个Push过程都假设是从A页面跳转到B页面 1.1 从不显示导航栏的页面Push到显示导航栏的页面。 关于导航栏的显示,是否顺滑,是通过如下两个方法来控制。...// 不显示动画,导航栏显示就比较突兀 [self.navigationController setNavigationBarHidden:YES]; // 显示动画,在侧滑时,导航栏显示就比较顺滑...第一种方案比较简单就不做赘述了,第二种方案是这样的: 自定义导航控制器,然后重写如下方法: - (void)pushViewController:(UIViewController *)viewController...- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { UIBarButtonItem
(NSInteger)barStyle; #pragma mark - ******** 设置列表控制器的样式 + (void)setupListnavigationItemAndBarStyle:(UIViewController...*)vc; + (void)setupDetailnavigationItemAndBarStyle:(UIViewController*)vc; @end 复制代码 1.2 设置全局导航条按钮主题...]; } 复制代码 1.4 拦截push #pragma mark - 拦截push;--//90%的拦截,都是通过自定义类,重写自带的方法实现 - (void)pushViewController...:(UIViewController *)viewController animated:(BOOL)animated{ if (self.viewControllers.count>0) {...viewController.navigationItem.leftBarButtonItem = tmp; } } [super pushViewController
后者显示不出来。...步骤如下: 1.在视图控制器的头文件中实现UINavigationControllerDelegate,例如: @interface PicturePreviewViewController: UIViewController...void) navigationController: (UINavigationController *)navigationController willShowViewController: (UIViewController... self.navigationController.navigationBar.tintColor = nil; self.navigationController.navigationBar.translucent...: YES]; [super pushViewController: viewController animated: animated]; 而Tabbar的显示,则只有在Pop函数调用前执行才真正起作用
pushViewController(viewController, animated:true) } 3、AppDelegate.swift中的didFinishLaunchingWithOptions...true } 4、SecondSubViewController.swift import UIKit var pageNum = 0 class SecondViewController:UIViewController...pushViewController(viewController,animated:true) } func popPage() { self.navigationController?....navigationBar.isTranslucent= false self.navigationController?....navigationBar.barStyle =UIBarStyle.black self.navigationController?.
,UITabBarController 其中,容器类ViewController是这篇文章关注的重点,因为他们管理着View的显示逻辑。 ...同时UINavigationController还持有屏幕上方的交互栏(navigationBar)和屏幕下方的工具栏(toolBar),并控制他们是否可见。 ...而点击应用上方的NavigationBar返回按钮(如果没有隐藏起来的话)就会pop当前的ViewController,也就是返回上一层。...:vc1 animated:NO]; //把vc1推到nav的stack中[nav pushViewController:vc2 animated:NO]; //把vc2推到nav的stack中...//这时nav的顶层VC被pop出,top变成vc1 通过解析源码的方法,发现UINavigationController不仅有简单的pushViewController和popViewController
mainController]; // 给窗口指定根视图控制器 _window.rootViewController = nav; // 让当前窗口成为主窗口并显示...第一次显示出来的自控制器; 2,addChildViewController:此方法是UIViewController的方法,可以用来添加子控制器; 3,通过属性viewControllers进行设置...此属性是UINavigationController的,它可以一次添加多个自控制器; 4,最正常的用法: pushViewController,入栈的方式添加自控制器。...:(UIViewController *)viewController animated:(BOOL)animated; 2.4.3 出栈 返回到上一个控制器(将栈顶的控制器移除) -(UIViewController...imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; navigationController 和navigationItem都是通过"控制器"对象调用的 navigationBar
- (UIViewController *)getCurrentVC { UIViewController *result = nil; UIWindow * window = [[UIApplication...objectAtIndex:0]; id nextResponder = [frontView nextResponder]; if ([nextResponder isKindOfClass:[UIViewController...} else { result = window.rootViewController; } return result; } 第二种写法: //登录接口 UIViewController...objectAtIndex:0]; id nextResponder = [frontView nextResponder]; if ([nextResponder isKindOfClass:[UIViewController
*> *)viewControllers animated:(BOOL)animated; //压入新的视图控制器 - (void)pushViewController:(UIViewController... *topViewController; //返回显示的controller @property(nullable, nonatomic,readonly,strong) UIViewController...上面两个方法的区别在于,topViewController是返回被push出的最后一个controller,但是如果之后又有present进行莫泰跳转,visibleViewController会返回当前显示的...setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated; //导航栏对象,只读属性 @property(nonatomic,readonly) UINavigationBar *navigationBar...nonatomic, readwrite, assign) BOOL hidesBarsWhenKeyboardAppears; //屏幕滑动的时候隐藏导航栏,常用于tableView,上滑隐藏导航栏,下滑显示
UINavigationController 根据具体情况,通过push方法添加对应个数的子控制器 UINavigationController以栈的形式保存子控制器 使用push方法能将某个控制器压入栈 - (void)pushViewController...:(UIViewController *)viewController animated:(BOOL)animated; //使用pop方法可以移除控制器 //将栈顶的控制器移除 - (UIViewController...rightBarButtonItem; 清空导航条背景图片 // 清空导航条背景图片,系统判断当前是否为Nil,如果为nil,系统还是会自动生成一张背景图片 [self.navigationController.navigationBar...setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault]; [self.navigationController.navigationBar...dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion; Modal原理 //如果一个控制器的View显示在界面上
Push 出控制器后,底部 TabBar 隐藏/显示问题 在导航控制器的基类里面重写一下push方法 判断如果不是根控制器,那么push的时候就隐藏BottomBar 注意调用super.pushViewController...要在重写方法之后 HQNavigationController.swift override func pushViewController(_ viewController: UIViewController...里自定义 class HQBaseViewController: UIViewController { /// 自定义导航条 lazy var navigationBar =...(withHex: 0xF6F6F6) 设置左侧 leftBarButtonItem 左侧都是返回(第二级页面以下) 或者是上一级title的名称(只在第二级页面这样显示) 在重写pushViewController...reloadData() } } ---- 未登录视图显示(访客视图) 现实中经常会遇到一些临时增加的需求,比如登录后显示的是一种视图,未登录又显示另外一种视图,如果你的公司是面向公司内部的APP
没有适配 iPhoneX的触底页面 旧工程如何在iphoneX全屏显示 只需要在LaunchImage中添加一个尺寸为1125 × 2436的启动图,并且工程使用LaunchImage加载启动图的,而不是使用...bounds.size.width/375 #define NEWY NEWX iPhone X 变化最大的是头部 & 底部 非iPhone X : StatusBar 高20px,NavigationBar...高44px,底部TabBar高49px iPhone X: StatusBar 高44px,NavigationBar 高44px,底部TabBar高83px 所以,之前项目里写死的 ±49 ±64...:(UIViewController *)viewController animated:(BOOL)animated { if (self.viewControllers.count...关于状态栏另外两个需要注意的地方: 不要在iPhone X下隐藏状态栏,一个原因是显示内容足够高了,另一个是这样内容会被刘海切割。 ?
UIViewController实例负责设置视图的外观和它显示的子视图。 UINavigationController类 1. 导航控制器使用内置动画在视图之间切换; 2....使用pushViewController: animated:可推入一个新的控制器,从而增加新的项到导航栈。(记住:导航栏控制器不添加一个视图进去,这个导航栏是没有意义的!)...UIViewController *aView = [[UIViewController alloc] initWithNibName:(*xib文件名*)]; [aNav pushViewController...导航栏可以通过直接访问navigationBar属性,改变栏的风格或者它的颜色: C代码 self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent...其描述了导航栏上显示的内容,而正好UIViewController另有一导航项属性navigationItem包括左栏按钮(leftBarButtonItem)、右栏按钮(rightBarButtonItem
- (BOOL)shouldForceEnableInteractivePopGestureRecognizer { UIViewController *viewController = [self...自定义了leftBarButtonItem按钮 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)...viewController.navigationItem.leftBarButtonItems = @[backItem]; } [super pushViewController...2.2 解决方法 所以当你自定义导航栏(自定义了leftBarButtonItem按钮)没采用系统的默认的实现,发生当前不可以手势返回,可先检查为什么当前状态,系统不允许你的手势返回,例如是否隐藏了 navigationBar...比如push的时候,自定义了leftBarButtonItem按钮了,你可以采用分类方式往UIViewController 添加forceEnableInteractivePopGestureRecognizer
tabBarController属性,通过它可以访问所在的UITabBarController 每个视图控制器都有一个tabBarItem属性,通过它控制视图在UITabBarController的tabBar中的显示信息...alloc] initWithRootViewController:vc2]; self.viewControllers=@[nav1,nav2]; 设置TabBar背景颜色 tabBar和navigationBar...:next animated:YES]; self.hidesBottomBarWhenPushed=NO; //这样back回来的时候,tabBar会恢复正常显示。...只需在第一层页面向第二层页面跳转的地方设置一次即可,第二层向第三层跳转时不需要再次设置,当然,想在第三层页面上显示出 tabbar,设置.hidesBottomBarWhenPushed = NO也是不可能的出效果的...=[[NextViewController alloc]init]; next.hidesBottomBarWhenPushed = YES; [self.navigationController pushViewController
pushViewController。 返回界面 左上角的返回按钮。 屏幕边缘滑动。 navigationController?.popViewController。...通过栈管理 UIViewController:先进后出。 pushViewController:压栈。 popViewController:出栈。...UINavigationItem是 UIViewController 的属性,用于配置当前 UIViewController 显示时UINavigationBar上显示的内容。...如果当前 UIViewController 设置了title属性,则显示标题文字。 如果都没设置,则显示空白。 iOS11 之后可以设置大标题。...navigationBar.prefersLargeTitles = true // 当前界面是否显示大标题,never表示不显示大标题即显示小标题 navigationItem.largeTitleDisplayMode
使用一张图片)但是这张图片设置好以后,所有的控件的Y坐标都会下移64,也就是说,这张图片会占用屏幕的64pt 高度的屏幕,而且无法被普通试图覆盖使用 [self.navigationController.navigationBar...右边的粗的返回箭头还在 SecondViewController *sec = [[SecondViewController alloc]init]; [self.navigationController pushViewController...:sec animated:YES ]; 在push 之后的那个VC中可以设置这返回的颜色: [self.navigationController.navigationBar setTintColor...navigationItem navigationItem是UIViewController的一个属性,包含了当前页面导航栏上需要显示的全部信息,这个属性是为UINavigationController...每个视图控制器都有一个navigationItem属性,navigationItem中设置的做按钮、右按钮、标题等,会随着控制器的显示,也显示到navigationBar上 我们来看一下这些名词是什么意思
vc = [storyboard instantiateViewControllerWithIdentifier:@"IDENTIFIER"]; [self.navigationController pushViewController...:vc animated:YES]; Assuming you have a xib file you want to do: UIViewController *vc = [[UIViewController...alloc] initWithNibName:@"NIBNAME" bundle:nil]; [self.navigationController pushViewController:vc animated...:YES]; Without a xib file: UIViewController *vc = [[UIViewController alloc] init]; [self.navigationController...pushViewController:vc animated:YES];
导航栏的样式变化 对于不同 ViewController 之间的导航栏样式变化,大多可以总结为两种情况: 导航栏的显示与否 导航栏的颜色变化 导航栏的显示与否 对于显示与否的问题,可以在上一节提到的两个方法里调用...的对齐问题,它会影响 UIViewController 的实际大小,例如 edgesForExtendedLayout 的值为 UIRectEdgeAll 时,UIViewController 会占据整个屏幕的大小...不要随意修改 translucent 属性,包括隐式的修改和显示的修改。...不过它也有一些自己独特的地方,为了更好的让大家理解整个过程,我们设计这样一个场景,从页面 A push 到页面 B,结合之前探讨过的方法调用顺序,我们可以知道几个核心方法的调用顺序大致如下: 页面 A 的 pushViewController...检查是否有改动 translucent 属性,包括显示修改和隐式修改,如果有,请做调整。
领取专属 10元无门槛券
手把手带您无忧上云