zoukankan      html  css  js  c++  java
  • iOS基础界面和导航详解

    iOS基础界面就是通过UIViewController展示的。首先区分content controller和container controller的区别。content controlller就是展示我们当前页面的controller,而container controller就是一个管理content controller的容器,基本就是UINavigationController和UITabbarController,本身它也是继承UIViewController,一个UIViewController压栈就是把它加入到container controller的view上。

    下面说一下UIViewController的生命周期:

    1. -(void)loadView;  这里用来加载controller的view,一般我们都必须调用[super loadView]来完成对view的加载,当然如果不需要用self.view也可以。然后再对我们需要的子view进行生成和布局。

    2.- (void)viewDidLoad; 这里代表view已经加载完成,一般用来处理数据model之类的。

    3.- (void)viewWillAppear:(BOOL)animated; Controller将要被加入到当前window的回调,每次push或pop到当前controller就会回调这个函数,代表界面将要展示出来。

    4.-(void)viewDidAppear:(BOOL)animated; Controller已经被加入到当前window,也就是push、present或pop的动画已经完成。

    {可能被大多数人忽略的是,在每次调用viewWillAppear或viewDidAppear,系统都会调用一下两个函数:

    (1)(void)viewWillLayoutSubviews 这个可能很多人忽略了,是5.0才增加的函数,界面将要对子view进行布局。当通话或录音状态中,状态栏下移,也会回调这个函数。

    (2)-(void)viewDidLayoutSubviews 这个跟4对应,也是5.0增加的函数,对子view布局完成。

    }

    一般在上面4个函数,我们已经可以完成界面的展示。记得它们的先后顺序是必须的。至于收到内存警告,在6.0等不同版本controller的不同回调我之前已经介绍过了,就不再介绍了。

     

    关于Container Controller:

    这里就只说介绍UINavigationController,本身它就是继承UIViewController,所以它具有上面所说的生命周期。至于什么东西应该放在viewController,什么应该放在navgationController呢,这里说说我的理解。

    因为navgationController就是管理controller的容器,所以它处理的应该就是controller的关系。并且在某种意义上,它里面的controller就相当于它的一个子view,所以在navgationController的操作就能控制它里面的每个controller。下面以现在比较流行的手势导航为例:(也就是在二级页面向右滑动就能返回)

     

    @interface TestNavigationController ()

    {

        UIPanGestureRecognizer *_panGesture;   //手势导航的recognizer

        CGPoint _panStartPoint;    //记录开始滑动的point,只有滑动到一定宽度才开启导航

    }

    @property(nonatomic,retain)UIPanGestureRecognizer *panGesture;

    @end

     

    @implementation TestNavigationController

    @synthesize panGesture = _panGesture;

    - (void)viewDidLoad

    {

        [super viewDidLoad];

       //在navgationController的view添加手势,也就是为每个当前的controller添加了手势

        [self.view removeGestureRecognizer:self.panGesture];

        UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizeralloc] initWithTarget:self

                                                                                         action:@selector(handlePanGesture:)];

         panGesture.minimumNumberOfTouches = 1;

         panGesture.maximumNumberOfTouches = 1;

         panGesture.delegate = self;

         self.panGesture = panGesture;

         [panGesture release];

        [self.view addGestureRecognizer:self.panGesture];

    }

     -(void)handlePanGesture:(UIPanGestureRecognizer*)pan

    {

     //记录开始滑动的point

        if(pan.state == UIGestureRecognizerStateBegan){

            _panStartPoint = [pan locationInView:self.view];

        }    

       //在滑动结束,判断滑动的距离是不是适合宽度,处理是否返回上级页面

        if(pan.state == UIGestureRecognizerStateEnded)   {

            CGPoint _endPoint = [pan locationInView:self.view];

            if(_endPoint.x - _panStartPoint.x > 70.0f){

                //二级页面就能滑动返回

                if([self.viewControllers count] > 1){

                    [self popViewControllerAnimated:YES];

                }

            }

        }

    #pragma mark UIGestureRecognizerDelegate method    //手势的delegate,处理一些同时进行的手势操作

    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

    {

        //一般情况下,如果上下滑动幅度太大,应该就是在滑动controller的tableview之类的,就不开启滑动导航

        if (gestureRecognizer == self.panGesture) {

            CGPoint translation = [(UIPanGestureRecognizer *)gestureRecognizer translationInView:self.view];

            return ((fabs(translation.x) / fabs(translation.y) > 5.0f) ? YES : NO);

        }

        return YES;

    }

    当我们把appDelegate的window.rootViewController设为TestNavigationController,就可以很方便快捷地实现滑动手势导航功能。

     

    下面说一下静态视图modelViewController,通常我们就是用

    - (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion压入一个模态视图。其实静态的概念就是它入栈的方式和动画不同而已。需要注意的是,一个navgationController不可以push一个navgationController,但是可以present一个navgationController。另外,无论是一个viewController,还是navgationController,都可以present一个modelViewController,并且modelViewController并不加入到navgationController的导航栈中。

    所以navgationController的topViewController和visibleViewController是不同概念的。topViewController就是导航栈stack的栈顶,也就是不包括modelViewController,而visibleViewController是当前展示的viewController,如果有模态视图就是模态视图,否则就是topViewController。

     

    最后用一句话总结, A viewController is a set of views, A navgationcontroller is a set of viewControllers.

    基本上基础UIViewController和NavgationController的介绍就到这里了。大家觉得还有其他重要的东西可以补充。谢谢指导。

     

     

  • 相关阅读:
    SQL Server存储过程
    数据访问模式:数据并发控制(Data Concurrency Control)
    C#设计模式系列:观察者模式(Observer)
    awk内置字符串函数 awk 格式化输出
    使用MegaCli和Smartctl获取普通磁盘
    Shell之date用法
    linux 系统下查看raid信息,以及磁盘信息
    linux下proc里关于磁盘性能的参数
    hdparm测试硬盘性能
    查看现有运行的linux服务器有多少内存条
  • 原文地址:https://www.cnblogs.com/vicstudio/p/3138260.html
Copyright © 2011-2022 走看看