iOS - UINavigationController

简介: 前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UINavigationController : UIViewController @available(iOS 2.0, *) public class UINavigationController : UIViewControllerUINavigationController:容器视图控制器的一种,称之为导航视图控制器,导航视图控制器固定高度是 44。

前言

    NS_CLASS_AVAILABLE_IOS(2_0) @interface UINavigationController : UIViewController
    @available(iOS 2.0, *)       public class UINavigationController : UIViewController
  • UINavigationController:容器视图控制器的一种,称之为导航视图控制器,导航视图控制器固定高度是 44。

  • 导航视图控制器中存放的是视图控制器。

  • 导航条的颜色与状态条相同。

1、navigationController 的创建

  • Objective-C

        ViewController1 *viewController1 = [[ViewController1 alloc] init];
    
        // 相当于将 viewController1 对象放到 navigationController 容器中,现在容器中只有一个视图控制器
        UINavigationController *navigationController = [[UINavigationController alloc] 
                                                           initWithRootViewController: viewController1];
    
        // 将 navigationController 添加到 viewController 上
        [self addChildViewController:navigationController];
        [self.view addSubview:navigationController.view];
    
        // 将 navigationController 做为 window 的根视图控制器
        self.window.rootViewController = navigationController;      
  • Swift

        let viewController1 = ViewController1()
    
        // 相当于将 viewController1 对象放到 navigationController 容器中,现在容器中只有一个视图控制器
        let navigationController = UINavigationController(rootViewController: viewController1)
    
        // 将 navigationController 添加到 viewController 上
        self.addChildViewController(navigationController)
        self.view.addSubview(navigationController.view)
    
        // 将 navigationController 做为 window 的根视图控制器
        self.window?.rootViewController = navigationController     

2、navigationBar 导航条的设置

  • navigationBar 属性是属于 navigationController 的,不是某个 viewController 的,在一个 viewController 中设置,其他的 viewController 的导航条也会改变。

  • 导航条的设置除 appearance 外都在 viewController 中完成设置。

  • Objective-C

        // 设置导航条类型
        /*
            UIBarStyleDefault  白色半透明,默认,不设置时默认为白色半透明
            UIBarStyleBlack    灰色半透明
        */
        self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
    
        // 设置导航条标题文字的字体和颜色
        /*
            appearance 用于对没有创建的控件进行统一设置,无法对已经创建的控件进行设置
        */
        [UINavigationBar appearance].titleTextAttributes = @{NSFontAttributeName:[UIFont boldSystemFontOfSize:20], 
                                                  NSForegroundColorAttributeName:[UIColor yellowColor]};
    
        // 设置按钮文字颜色
        /*
            设置按钮的颜色,默认为蓝色,在 iOS6 中是设置背景颜色
        */
        self.navigationController.navigationBar.tintColor = [UIColor redColor];
    
        // 设置导航条背景颜色
        /*
            默认为白色半透明
        */
        self.navigationController.navigationBar.barTintColor = [UIColor lightGrayColor];
    
        // 设置导航条的背景图片
        /*
            如果图片的高正好是 44,图片与整个导航的高重合,这时候最上面 20 的状态条回到 ios6 以前的效果变成黑色的。
            如果图片的高不是 44,哪怕比 44 多一个像素 45,这时候图片往上拉伸,占据状态栏的 20,这时整个高度为 64。
        */
        [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"pic2"] 
                                                      forBarMetrics:UIBarMetricsDefault];
    
        // 设置是否关闭导航条半透明状态
        /*
            NO:关闭,关闭时导航控制器下方视图的 y 坐标为 64,打开时为 20。默认打开
        */
        self.navigationController.navigationBar.translucent = NO;
    
        // 设置是否隐藏导航视图控制器
        /*
            显示时导航控制器下方视图的 y 坐标为 64,隐藏时为 20
        */
        self.navigationController.navigationBarHidden = YES;
  • Swift

        // 设置导航条类型
        /*
            Default   白色半透明,默认,不设置时默认为白色半透明
            Black     灰色半透明
        */
        self.navigationController!.navigationBar.barStyle = UIBarStyle.Default
    
        // 设置导航条标题文字的字体和颜色
        /*
            appearance 用于对没有创建的控件进行统一设置,无法对已经创建的控件进行设置
        */
        UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName:UIFont.boldSystemFontOfSize(20), 
                                                 NSForegroundColorAttributeName:UIColor.yellowColor()]
    
        // 设置按钮文字颜色
        /*
            设置按钮的颜色,默认为蓝色,在 iOS6 中是设置背景颜色
        */
        self.navigationController!.navigationBar.tintColor = UIColor.redColor()
    
        // 设置导航条背景颜色
        /*
            默认为白色半透明
        */
        self.navigationController!.navigationBar.barTintColor = UIColor.lightGrayColor()
    
        // 设置导航条的背景图片
        /*
            如果图片的高正好是 44,图片与整个导航的高重合,这时候最上面 20 的状态条回到 ios6 以前的效果变成黑色的。
            如果图片的高不是 44 ,哪怕比 44 多一个像素 45,这时候图片往上拉伸,占据状态栏的 20,这时整个高度为 64。
        */
        self.navigationController!.navigationBar.setBackgroundImage(UIImage(named: "pic2"), 
                                                      forBarMetrics: UIBarMetrics.Default)
    
        // 设置是否关闭导航条半透明状态
        /*
            false:关闭,关闭时导航控制器下方视图的 y 坐标为 64,打开时为 20。默认打开
        */
        self.navigationController!.navigationBar.translucent = false
    
        // 设置是否隐藏导航视图控制器
        /*
            显示时导航控制器下方视图的 y 坐标为 64,隐藏时为 20
        */
        self.navigationController!.navigationBarHidden = true

3、navigationItem 导航栏的设置

  • navigationItem 属性不是公有的,是每个 ViewController 都有一个自己 navigationItem,设置自己界面上的 navigationItem 属性不会影响其他的 viewController 界面。

  • 导航栏的设置在 viewController 中完成设置。不设置左侧按钮(leftBarButtonItem)时,系统会自动以上一个视图控制器的标题作为左侧按钮,并自带返回响应事件。

  • Objective-C

        // 设置导航栏提示内容
        /*
            导航栏提供了一个很少用的提示模式,该模式将高度扩展了 30 像素
        */
        self.navigationItem.prompt = @"hello";
    
        // 设置标题
        self.navigationItem.title = @"详情页";
    
        // 设置自定义标题视图
        /*
            x,y,width 设置无效,图片不会自动压缩
        */
        self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"logo_title.png"]];
    
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 0, 35)];
        imageView.image = [UIImage imageNamed:@"logo_title.png"];
        self.navigationItem.titleView = imageView;
    
        // 设置按钮文字颜色
        /*
            需要先设置按钮才能生效,iOS6 中是设置背景颜色,在 iOS7 以后变成设置文字颜色
        */
        self.navigationItem.leftBarButtonItem.tintColor = [UIColor redColor];
        self.navigationItem.rightBarButtonItem.tintColor = [UIColor greenColor];
    
        // 设置导航栏按钮
    
            // 1、通过设置标题文字设置
            /*
                设置左侧按钮,当设置左按钮的时候,自动隐藏系统自带的返回上一页,需手动设置按钮点击事件
            */
            self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" 
                                                                           style:UIBarButtonItemStylePlain 
                                                                          target:self 
                                                                          action:@selector(leftButtonClick:)];
    
            // 2、通过系统编辑按钮设置
            /*
                系统自带的导航专用编辑按钮,点击后变为 Done,再次点击变回 Edit,自带点击响应事件
            */
            self.navigationItem.rightBarButtonItem = self.editButtonItem;
    
                // 系统自带编辑按钮点击响应事件,self.editButtonItem 自带的点击事件
                - (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    
                    // 使用这个方法时,需要让父类也执行一下这个方法
                    [super setEditing:editing animated:animated];
                }
    
            // 3、通过系统提供的样式设置
            /*
                UIBarButtonSystemItemDone,           Done
                UIBarButtonSystemItemCancel,         Cancel
                UIBarButtonSystemItemEdit,           Edit
                UIBarButtonSystemItemSave,           Save
                UIBarButtonSystemItemUndo,           Undo
                UIBarButtonSystemItemRedo,           Redo
                UIBarButtonSystemItemAdd,            加号 图标按钮
                UIBarButtonSystemItemFlexibleSpace,  弹簧 按钮,将 button 推向两边
                UIBarButtonSystemItemFixedSpace,     弹簧 按钮,将 button 推向两边,
                                                     可设间距 fixedSpaceButton.width = 50;
                UIBarButtonSystemItemCompose,        撰写 图标按钮
                UIBarButtonSystemItemReply,          答复 图标按钮
                UIBarButtonSystemItemAction,         详情 图标按钮
                UIBarButtonSystemItemOrganize,       文件夹 图标按钮
                UIBarButtonSystemItemBookmarks,      书籍 图标按钮
                UIBarButtonSystemItemSearch,         搜索 图标按钮
                UIBarButtonSystemItemRefresh,        刷新 图标按钮
                UIBarButtonSystemItemStop,           X 号 图标按钮
                UIBarButtonSystemItemCamera,         相机 图标按钮
                UIBarButtonSystemItemTrash,          删除 图标按钮
                UIBarButtonSystemItemPlay,           播放 图标按钮
                UIBarButtonSystemItemPause,          暂停 图标按钮
                UIBarButtonSystemItemRewind,         快退 图标按钮
                UIBarButtonSystemItemFastForward,    快进 图标按钮
            */
    
            self.navigationItem.rightBarButtonItem =[[UIBarButtonItem alloc] 
                                                initWithBarButtonSystemItem: UIBarButtonSystemItemCamera 
                                                                     target: self 
                                                                     action: @selector(rightButtonClick:)];
    
            // 4、通过图片设置
            /*
                处理阴影,如果直接设置 image 出现阴影,这时候需要设置图片渲染方式
            */
            UIImage *image = [[UIImage imageNamed:@"main_right_nav.png"] 
                                                 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    
            self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] 
                                                               initWithImage: image 
                                                                       style: UIBarButtonItemStylePlain 
                                                                      target: self 
                                                                      action: @selector(rightButtonClick:)];
    
            // 5、通过自定义视图设置
            /*
                前两个坐标设置无效,图片会自动压缩
            */
            UIButton *myView = [UIButton buttonWithType:UIButtonTypeCustom];
            myView.frame = CGRectMake(0, 0, 50, 30);
            [myView setBackgroundImage:[UIImage imageNamed:@"pic1"] forState:UIControlStateNormal];
            [myView addTarget:self action:@selector(rightButtonClick:) forControlEvents:UIControlEventTouchUpInside];
    
            self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:myView];
  • Swift

        // 设置导航栏提示内容
        /*
            导航栏提供了一个很少用的提示模式,该模式将高度扩展了 30 像素
        */
        self.navigationItem.prompt = "hello"
    
        // 设置标题
       self.navigationItem.title = "详情页"
    
        // 设置自定义视图标题
        /*
            x,y,width 设置无效,图片不会自动压缩
        */
        self.navigationItem.titleView = UIImageView(image: UIImage(named: "logo_title.png"))
    
        let imageView = UIImageView(frame: CGRectMake(0, 0, 0, 35))
        imageView.image = UIImage(named: "logo_title.png")
        self.navigationItem.titleView = imageView
    
        // 设置按钮文字颜色
        /*
            需要先设置按钮才能生效,在 iOS6 中是设置背景颜色,在 iOS7 以后变成设置文字颜色
        */
        self.navigationItem.leftBarButtonItem?.tintColor = UIColor.redColor()
        self.navigationItem.rightBarButtonItem?.tintColor = UIColor.greenColor()
    
        // 设置导航栏按钮
    
            // 1、通过设置标题文字设置
            /*
                设置左侧按钮,当设置左按钮的时候,自动隐藏系统自带的返回上一页,需手动设置按钮点击事件
            */
            self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "返回", 
                                                                           style: .Plain, 
                                                                          target: self, 
                                              action: #selector(ViewController2.leftButtonClick(_:)))
    
            // 2、通过系统编辑按钮设置
            /*
                系统自带的导航专用编辑按钮,点击后变为 Done,再次点击变回 Edit,自带点击响应事件
            */
            self.navigationItem.rightBarButtonItem = self.editButtonItem();
    
            // 3、通过系统提供的样式设置
            /*
                Done,            Done
                Cancel,          Cancel
                Edit,            Edit
                Save,            Save
                Undo,            Undo
                Redo,            Redo
                Add,             加号 图标按钮
                FlexibleSpace,   弹簧 空按钮,将 button 推向两边
                FixedSpace,      弹簧 空按钮,将 button 推向两边,可设置间距 fixedSpaceButton.width = 50;
                Compose,         撰写 图标按钮
                Reply,           答复 图标按钮
                Action,          详情 图标按钮
                Organize,        文件夹 图标按钮
                Bookmarks,       书籍 图标按钮
                Search,          搜索 图标按钮
                Refresh,         刷新 图标按钮
                Stop,            X 号 图标按钮
                Camera,          相机 图标按钮
                Trash,           删除 图标按钮
                Play,            播放 图标按钮
                Pause,           暂停 图标按钮
                Rewind,          快退 图标按钮
                FastForward,     快进 图标按钮             
            */
            self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Camera, 
                                                                                  target: self, 
                                                      action: #selector(ViewController2.rightButtonClick(_:)))
    
            // 4、通过图片设置
            /*
                处理阴影,如果直接设置 image 出现阴影,这时候需要设置图片渲染方式
            */
            let image = UIImage(named: "main_right_nav.png")?.imageWithRenderingMode(.AlwaysOriginal)
    
            self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: image, 
                                                                     style: .Plain, 
                                                                    target: self, 
                                         action: #selector(ViewController2.rightButtonClick(_:)))
    
            // 5、通过自定义视图设置
            /*
                前两个坐标设置无效,图片会自动压缩
            */
            let myView = UIButton(type: .Custom)        myView.frame = CGRectMake(0, 0, 50, 30)
            myView.setBackgroundImage(UIImage(named: "pic1"), forState: UIControlState.Normal)
            myView.addTarget(self, action: #selector(ViewController2.rightButtonClick(_:)), 
                         forControlEvents: .TouchUpInside)
    
            self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: myView)

4、toolBar 工具条的设置

  • navigationController 自带的 toolbar 属性是所有添加在 navigationController 上的视图所共用的,是属于 navigationController 的,不是属于每个 ViewController 的,但 toolbar 上显示的内容的是每个 ViewController 的,需要在每个 ViewController 上单独设置。

  • toolbar 的显示状态会被带到已经显示过的 ViewController 上,跳转到未显示过的 ViewController 时,toolbar 再次被隐藏。

  • Objective-C

        // 显示 toolBar
        /*
            toolBar 默认是隐藏的,首先需要让它显示出来,默认在屏幕的最下方
        */
        self.navigationController.toolbarHidden = NO;
    
        // 向 toolBar 添加按钮
        /*
            往 toolBar 上添加按钮,最多只能显示8个,往 self.navigationController.toolbarItems 上添加时无用
        */
        self.toolbarItems = buttonArray;
  • Swift

        // 显示 toolBar
        /*
            toolBar 默认是隐藏的,首先需要让它显示出来,默认在屏幕的最下方
        */
        self.navigationController!.toolbarHidden = false
    
        // 向 toolBar 添加按钮
        /*
            往 toolBar 上添加按钮,最多只能显示8个,往 self.navigationController.toolbarItems 上添加时无用
        */
        self.toolbarItems = buttonArray

5、NC 中 viewController 页面设置

  • Objective-C

        // 设置标题
        /*
            标题会显示在导航视图控制器中根视图的导航条中
        */
        viewController1.title = @"vc1 title";
        viewController1.navigationItem.title = @"vc1";
    
        // 隐藏分栏视图控制器
        /*
            导航视图控制器推出新的视图时,隐藏新视图下的分栏视图控制器
        */
        viewController1.hidesBottomBarWhenPushed = YES;
  • Swift

        // 设置标题
        /*
            标题会显示在导航视图控制器中根视图的导航条中
        */
        viewController1.title = "vc1 title"
        viewController1.navigationItem.title = "vc1"
    
        // 隐藏分栏视图控制器
        /*
            导航视图控制器推出新的视图时,隐藏新视图下的分栏视图控制器
        */
        viewController1.hidesBottomBarWhenPushed = true

6、NC 中 viewController 页面跳转

  • 跳转到未设置背景颜色(包含 clearColor)的 ViewController 界面时,会发生卡顿的现象。

  • Objective-C

        // 跳转到新页
    
            // 推出新页
            /*
                自动将 otherViewController 添加到 navigationController 容器中
            */
            [self.navigationController pushViewController:otherViewController animated:YES];
    
        // 跳转到已添加页
    
            // 返回上一页
            [self.navigationController popViewControllerAnimated:YES];
    
            // 返回到指定页
            /*
                viewController 添加在容器视图中的顺序已知
            */
            [self.navigationController popToViewController:self.navigationController.viewControllers[1] 
                                                  animated:YES];
    
            // 返回到指定页
            /*
                viewController 添加在容器视图中的顺序未知
            */
            for (UIViewController *viewController in self.navigationController.viewControllers) {
    
                if ([viewController isKindOfClass:[ViewController3 class]]) {
    
                    // 回到指定的某一页
                    [self.navigationController popToViewController:viewController animated:YES];
                }
            }
    
            // 返回到根视图
            [self.navigationController popToRootViewControllerAnimated:YES];
  • Swift

        // 跳转到新页
    
            // 推出新页
            /*
                自动将 otherViewController 添加到 navigationController 容器中
            */
            self.navigationController!.pushViewController(otherViewController, animated: true)
    
        // 跳转到已添加页
    
            // 返回上一页
            self.navigationController!.popViewControllerAnimated(true)
    
            // 返回到指定页
            /*
                viewController 添加在容器视图中的顺序已知
            */
            self.navigationController!.popToViewController(self.navigationController!.viewControllers[1], 
                                                   animated: true)
    
            // 返回到指定页
            /*
                viewController 添加在容器视图中的顺序未知
            */
            for viewController in self.navigationController!.viewControllers {
    
                if viewController.isKindOfClass(ViewController3.self) {
    
                    // 回到指定的某一页
                    self.navigationController!.popToViewController(viewController, animated: true)
                }
            }
    
            // 返回到根视图
            self.navigationController?.popToRootViewControllerAnimated(true)

7、创建假导航

  • 由假导航跳转到已经存在的 ViewController 界面时,需要在要跳转到的 ViewController 界面中打开显示原生导航。

  • Objective-C

        // 隐藏原生导航
        /*
            从其它视图控制器进入该视图控制器时隐藏原生导航,在该视图控制器中显示自定义的假导航
        */
        - (void)viewWillAppear:(BOOL)animated {
            self.navigationController.navigationBarHidden = YES;
        }
    
        // 显示原生导航
        /*
            退出该视图控制器时打开显示,在其它的视图控制其中继续显示原生导航
        */
        - (void)viewWillDisappear:(BOOL)animated {
            self.navigationController.navigationBarHidden = NO;
        }
    
        // 创建假导航
        - (void)createCustomNavigationController {
    
            UIImageView *imageView = [[UIImageView alloc] 
                                           initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, 44)];
            imageView.image = [UIImage imageNamed:@"pic1"];
            imageView.userInteractionEnabled = YES;
    
            UIButton *lastButton = [UIButton buttonWithType:UIButtonTypeCustom];
            lastButton.frame = CGRectMake(10, 7, 60, 30);
            [lastButton setTitle:@"上一页" forState:UIControlStateNormal];
            [lastButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
            [lastButton addTarget:self action:@selector(lastClick:) forControlEvents:UIControlEventTouchUpInside];
            [imageView addSubview:lastButton];
    
            UIButton *nextButton = [UIButton buttonWithType:UIButtonTypeCustom];
            nextButton.frame = CGRectMake(self.view.frame.size.width - 70, 7, 60, 30);
            [nextButton setTitle:@"下一页" forState:UIControlStateNormal];
            [nextButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
            [nextButton addTarget:self action:@selector(nextClick:) forControlEvents:UIControlEventTouchUpInside];
            [imageView addSubview:nextButton];
    
            // 添加自定义视图
            [self.view addSubview:imageView];   
        }
  • Swift

        // 隐藏原生导航
        /*
            从其它视图控制器进入该视图控制器时隐藏原生导航,在该视图控制器中显示自定义的假导航
        */
        override func viewWillAppear(animated: Bool) {
            self.navigationController!.navigationBarHidden = true
        }
    
        // 显示原生导航
        /*
            退出该视图控制器时打开显示,在其它的视图控制其中继续显示原生导航
        */
        override func viewWillDisappear(animated: Bool) {
            self.navigationController!.navigationBarHidden = false
        }
    
        // 创建假导航
        func createCustomNavigationController() {
    
            let imageView = UIImageView(frame: CGRectMake(0, 20, self.view.frame.size.width, 44))
            imageView.image = UIImage(named: "pic1")
            imageView.userInteractionEnabled = true
    
            let lastButton = UIButton(type: .Custom)
            lastButton.frame = CGRectMake(10, 7, 60, 30)
            lastButton.setTitle("上一页", forState:UIControlState.Normal)
            lastButton.setTitleColor(UIColor.blackColor(), forState:UIControlState.Normal)
            lastButton.addTarget(self, action: #selector(ViewController5.lastClick(_:)), forControlEvents: UIControlEvents.TouchUpInside)
            imageView.addSubview(lastButton)
    
            let nextButton = UIButton(type: .Custom)
            nextButton.frame = CGRectMake(self.view.frame.size.width - 70, 7, 60, 30)
            nextButton.setTitle("下一页", forState:UIControlState.Normal)
            nextButton.setTitleColor(UIColor.blackColor(), forState:UIControlState.Normal)
            nextButton.addTarget(self, action: #selector(ViewController5.nextClick(_:)), forControlEvents: UIControlEvents.TouchUpInside)
            imageView.addSubview(nextButton)
    
            // 添加自定义视图
            self.view.addSubview(imageView)
        }   

8、设置转场动画

  • 添加上一个页面 push 到本页面的动画效果。

  • Objective-C

        // 创建动画
        CATransition *animation = [CATransition animation];
    
        // 设置动画时间
        animation.duration = 1;
    
        // 设置动画方向
        /*
            四种预设,某些类型中此设置无效:
    
                kCATransitionFromRight
                kCATransitionFromLeft
                kCATransitionFromTop
                kCATransitionFromBottom
        */
        animation.subtype = kCATransitionFromTop;
    
        // 设置动画类型
        /*
            基本型:
                kCATransitionFade      交叉淡化过渡
                kCATransitionMoveIn    新视图移到旧视图上面
                kCATransitionPush      新视图把旧视图推出去
                kCATransitionReveal    将旧视图移开,显示下面的新视图
    
            用字符串表示的类型:
                fade   moveIn  push    reveal    和系统自带的四种一样
                pageCurl   pageUnCurl            翻页
                rippleEffect                     滴水效果
                suckEffect                       收缩效果,如一块布被抽走
                cube   alignedCube               立方体效果
                flip   alignedFlip   oglFlip     翻转效果
                rotate                           旋转
                cameraIris     cameraIrisHollowOpen    cameraIrisHollowClose      相机
        */
        animation.type = kCATransitionMoveIn;
    
        animation.type = @"pageCurl";
    
        // 添加动画效果
        /*
            向导航视图控制器上添加动画效果,添加完后再进行跳转
        */
        [self.navigationController.view.layer addAnimation:animation forKey:@"animation"];
  • Swift

        // 创建动画
        let animation = CATransition()
    
        // 设置动画时间
        animation.duration = 1
    
        // 设置动画方向
        /*
            四种预设,某些类型中此设置无效:
    
                kCATransitionFromRight
                kCATransitionFromLeft
                kCATransitionFromTop
                kCATransitionFromBottom
        */
        animation.subtype = kCATransitionFromTop
    
        // 设置动画类型
        /*
            基本型:
                kCATransitionFade     交叉淡化过渡
                kCATransitionMoveIn   新视图移到旧视图上面
                kCATransitionPush     新视图把旧视图推出去
                kCATransitionReveal   将旧视图移开,显示下面的新视图
    
            用字符串表示的类型:
                fade   moveIn  push    reveal      和系统自带的四种一样
                pageCurl   pageUnCurl              翻页
                rippleEffect                       滴水效果
                suckEffect                         收缩效果,如一块布被抽走
                cube   alignedCube                 立方体效果
                flip   alignedFlip     oglFlip     翻转效果
                rotate                             旋转
                cameraIris     cameraIrisHollowOpen    cameraIrisHollowClose      相机
        */
        animation.type = kCATransitionMoveIn
    
        animation.type = "pageCurl"
    
        // 添加动画效果
        /*
            向导航视图控制器上添加动画效果,添加完后再进行跳转
        */
        self.navigationController?.view.layer.addAnimation(animation, forKey: "animation")

9、Storyboard 中设置

  • 在 Storyboard 场景中设置

    • Navigation Controller

      Navigation1

      Bar Visibility 可见性
      -- Shows Navigation Bar 显示导航条
      -- Shows Toolbar 显示工具条
      Hide Bars
      -- On Swipe 滑动时隐藏导航条
      -- On Tap 点击时隐藏导航条
      -- When Keyboard Appears 键盘显示时隐藏导航条
      -- When Vertically Compact 垂直滑动时隐藏导航条
    • Navigation Item

      • 要在 Controller 的导航工具条上添加 Bar Button Item,需要先添加 Navigation Item

      Navigation2

      Title 导航条标题
      Prompt 导航条提示信息
      Back Buttom 自定义导航条返回按钮
  • 在 Storyboard 场景绑定的 Controller 中设置

        /*
            navigationItem 设置使用 self.navigationController.navigationItem 无效
        */
    
        self.navigationController.navigationBar.tintColor = [UIColor redColor];
    
        self.navigationItem.title = @"主页";
目录
相关文章
|
iOS开发
iOS开发UI之日期控件的使用(UIDatePicker)
iOS开发UI之日期控件的使用(UIDatePicker)
441 0
|
3月前
|
测试技术 Swift iOS开发
探索iOS自动化测试:使用Swift编写UI测试
【8月更文挑战第31天】在软件开发的海洋中,自动化测试是保证船只不偏离航线的灯塔。本文将带领读者启航,深入探索iOS应用的自动化UI测试。我们将通过Swift语言,点亮代码的灯塔,照亮测试的道路。文章不仅会展示如何搭建测试环境,还会提供实用的代码示例,让理论知识在实践中生根发芽。无论你是新手还是有经验的开发者,这篇文章都将是你技能提升之旅的宝贵指南。
|
机器学习/深度学习 安全 测试技术
阿里云EMAS-专家测试服务iOS和Android上百种机型性能、兼容及UI等测试
阿里云EMAS测试专家有着集团内部多个日活过亿规模APP经验,提供EMAS专家测试,客户只需提交测试需求,从用例设计、脚本录制、海量机型测试、整理测试结果、48小时输出专家测试报告均由阿里云EMAS测试专家一站式服务完成。覆盖功能测试、深度兼容测试、性能测试、UI适配测试以及隐私合规检测等,帮助用户以更低成本获得高质量的全面测试能力,可用于APP正式发版前验收,规避手机APP上线前或发版过程中各类隐患。
521 0
阿里云EMAS-专家测试服务iOS和Android上百种机型性能、兼容及UI等测试
|
jenkins 测试技术 macaca
iOS UI 自动化测试原理以及在 Trip.com 的应用实践
笔者入职 Trip.com 已满一年,回顾这一年的工作历程,约一半的时间都在做 UI 自动化测试相关内容。从而,笔者更深入地研究了 iOS 平台下的自动化测试技术,目前也在负责部门 App 自动化测试平台的搭建和维护。故想借这篇文章一并将所踩过的坑以及学习到的技术,系统且全面地整理出分享给大家。
390 0
iOS UI 自动化测试原理以及在 Trip.com 的应用实践
|
iOS开发
iOS开发UI篇 - Quartz 2D简单使用
iOS开发UI篇 - Quartz 2D简单使用
iOS开发UI篇 - Quartz 2D简单使用
|
缓存 运维 监控
如何优化iOS系统上的图文评论UI界面
在我们的社交 APP 上,⽤户的动态由精美的照⽚ 、视频和⽂字组成。对于每张照⽚和视频, 我 们都会展示出完整的标题和五个最新评论。由于⽤户喜欢使⽤标题来讲述照⽚背后的故事, 因此它们通常很⻓ 、很复杂, 并且可能包含超链 接和表情符号。渲染如此复杂的⽂本带来了⼀些问题, 它在滚动时造成性能下降。 即使在 iPhone 12 这样的新设备上, 复杂标题的初始⽂本绘制需要⻓达 50 毫秒, ⽽⽂本展示 需要⻓达 30 毫秒, 渲染速度很慢。⽂本问题还是简单问题, 有时我们需要加载更加复杂的图⽚甚⾄视频。所有这些步骤都发⽣在 UI 线程上, 导致app在⽤户滚动时丢帧。
如何优化iOS系统上的图文评论UI界面
|
存储 数据库 开发者
iOS9系列专题五——全新的联系人与联系人UI框架(二)
iOS9系列专题五——全新的联系人与联系人UI框架
400 0
iOS9系列专题五——全新的联系人与联系人UI框架(二)
|
编解码 安全 Linux
flutter 在windows和linux上运行IOS UI模拟器
之前发视频总是有人留言,我用的什么模拟器,今天给大家说一下 我一般用的是device_preview这个插件,这个插件的闲置是只能做UI上的模拟,并没有真正的运行环境。 近似您的应用程序在另一台设备上的外观和性能。
397 0
|
iOS开发 C++
iOS子线程更新UI的两种方法
iOS子线程更新UI的两种方法
526 0
|
UED iOS开发
iOS开发UINavigation系列四——导航控制器UINavigationController
iOS开发UINavigation系列四——导航控制器UINavigationController
269 0