zoukankan      html  css  js  c++  java
  • iOS 开发学习之 User Interface(4)UIView 与 UIViewController【二】

    UIViewController 生命周期

    从视图控制器创建,在屏幕上显示视图,再到被销毁的过程。一个生命周期内viewDidLoad只被调用一次。见图一

     

     

    // 视图控制器在经过alloc 之后,开始生成UIView

    - (void)loadView {

        [super loadView];

        // 加载视图

        // 如果有 storyboard 活着 xib, 那么视图控制器就直接获取它里面的UIView

        // 若无则需通过 [[UIView alloc] init]; 来生成一个view

        // 一般情况下,无需干涉此方法

        NSLog(@"加载视图(制作或获取视图):%s",__FUNCTION__);

    }

     

    // 视图加载完毕,注意:这个方法执行后,视图还没有显示到屏幕上

    - (void)viewDidLoad {

        [super viewDidLoad];

        // Do any additional setup after loading the view.

        

        self.view.backgroundColor = [UIColor redColor];

        // 添加一个按钮

        UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 150, 180, 40)];

        [self.view addSubview:btn];

        btn.backgroundColor = [UIColor blueColor];

        [btn setTitle:@"跳转到第二页" forState:UIControlStateNormal];

        [btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

        [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];

        

        NSLog(@"视图加载完毕:%s",__FUNCTION__);

    }

     

    // 视图将要显示到屏幕上

    - (void)viewWillAppear:(BOOL)animated {

        [super viewWillAppear:animated];

        NSLog(@"视图将要显示到屏幕上:%s",__FUNCTION__);

    }

     

    // 视图显示到了屏幕上

    - (void)viewDidAppear:(BOOL)animated {

        [super viewDidAppear:animated];

        NSLog(@"视图显示到了屏幕上:%s",__FUNCTION__);

    }

     

    // 视图将要离开屏幕

    - (void)viewWillDisappear:(BOOL)animated {

        [super viewWillDisappear:animated];

        NSLog(@"视图将要离开屏幕:%s",__FUNCTION__);

    }

     

    // 视图离开了屏幕

    - (void)viewDidDisappear:(BOOL)animated {

        [super viewDidDisappear:animated];

        NSLog(@"视图完全离开了屏幕:%s",__FUNCTION__);

        

        // 视图离开后销毁视图

        // 此设置仅为观察viewdidload 方法的执行,一般情况下不需要设置

    //    self.view = nil;

    }

    ——————————————————————————————

    两个视图控制器-两个页面

        > 模态方式切换视图控制器。

        presentViewController:animated:completion:     // 模态方式呈现另一个视图

        dismissViewControllerAnimated:completion:      // 移除被以模态方式呈现的视图

        > 页面过渡动画

        1.#define定义的常量 

         kCATransitionFade   交叉淡化过渡 

         kCATransitionMoveIn 新视图移到旧视图上面 

         kCATransitionPush   新视图把旧视图推出去 

         kCATransitionReveal 将旧视图移开,显示下面的新视图 

      

              2.用字符串表示 

         pageCurl            向上翻一页 

         pageUnCurl          向下翻一页 

         rippleEffect        滴水效果 

         suckEffect          收缩效果,如一块布被抽走 

         cube                立方体效果 

         oglFlip             上下翻转效果

    ——————————————————————————————

    动画

    <一>  UIView(UIViewAnimation) 类方法

    + (void)beginAnimations:(nullable NSString *)animationID context:(nullable void *)context;  // additional context info passed to will start/did stop selectors. begin/commit can be nested

    + (void)commitAnimations;                                                 // starts up any animations when the top level animation is commited

    // no getters. if called outside animation block, these setters have no effect.

    + (void)setAnimationDelegate:(nullable id)delegate;                          // default = nil

    + (void)setAnimationWillStartSelector:(nullable SEL)selector;                // default = NULL. -animationWillStart:(NSString *)animationID context:(void *)context

    + (void)setAnimationDidStopSelector:(nullable SEL)selector;                  // default = NULL. -animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context

    + (void)setAnimationDuration:(NSTimeInterval)duration;              // default = 0.2

    + (void)setAnimationDelay:(NSTimeInterval)delay;                    // default = 0.0

    + (void)setAnimationStartDate:(NSDate *)startDate;                  // default = now ([NSDate date])

    + (void)setAnimationCurve:(UIViewAnimationCurve)curve;              // default = UIViewAnimationCurveEaseInOut

    + (void)setAnimationRepeatCount:(float)repeatCount;                 // default = 0.0.  May be fractional

    + (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses;    // default = NO. used if repeat count is non-zero

    + (void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState;  // default = NO. If YES, the current view position is always used for new animations -- allowing animations to "pile up" on each other. Otherwise, the last end state is used for the animation (the default).

    + (void)setAnimationTransition:(UIViewAnimationTransition)transition forView:(UIView *)view cache:(BOOL)cache;  // current limitation - only one per begin/commit block

    + (void)setAnimationsEnabled:(BOOL)enabled;                         // ignore any attribute changes while set.

    + (BOOL)areAnimationsEnabled;

    + (void)performWithoutAnimation:(void (^)(void))actionsWithoutAnimation NS_AVAILABLE_IOS(7_0);

    案例一:

        //取出动画对象, uv

        UIView *uv = [self.view viewWithTag:1];

        // 创建一个动画块, 动画块的开始, 第一个为名字,第二个为动画上下文,都可以为nil

        [UIView beginAnimations:@"first_ani" context:nil];

        // 设置动画的持续时间

        [UIView setAnimationDuration:5.0];

        // 动画延时

        [UIView setAnimationDelay:5];

        // 动画执行的次数

        [UIView setAnimationRepeatCount:2];

        

        //

        uv.center = CGPointMake(50, self.view.frame.size.height-60);

        // 变化过程中颜色发生变化

        uv.backgroundColor = [UIColor blackColor];

        uv.layer.cornerRadius = 20;

        // 转圈

        uv.transform = CGAffineTransformRotate(uv.transform, M_PI);

        uv.transform  =CGAffineTransformScale(uv.transform, 0.4, 0.2);

        

        // 提交动画,使其执行

        [UIView commitAnimations];


    案例二:

        UIView *uv = [self.view viewWithTag:1];

        

        void (^block)(void) = ^(void){

            uv.transform = CGAffineTransformRotate(uv.transform, M_PI/3);

            

            // 创建一个动画块, 动画块的开始, 第一个为名字,第二个为动画上下文,都可以为nil

    //        [UIView beginAnimations:@"first_ani" context:nil];

    //        // 动画延时

    //        [UIView setAnimationDelay:5];

    //        // 动画执行的次数

    //        [UIView setAnimationRepeatCount:2];

    //        uv.center = CGPointMake(50, self.view.frame.size.height-60);

            

            // 取出 uv 的 center

            CGPoint pt = uv.center;

            pt.y -= 20;

            uv.center = pt;

        };

        

        //实用block 的形式创建动画

        [UIView animateWithDuration:2 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:block completion:^(BOOL finished){

            NSLog(@"动画完成了");

            

            [UIView animateWithDuration:1 animations:^(void) {

                uv.transform = CGAffineTransformRotate(uv.transform, -M_PI/3);

    //            uv.center = CGPointMake(150, 40);

                

                CGPoint pt2 = uv.center;

                pt2.y += 20;

                uv.center = pt2;

    //            uv.transform = CGAffineTransformRotate(uv.transform, 2*M_PI/3);

            }];

            

        }];


    案例三:

    一种更简单的方式:transform 平移

        // 设置 uv 的 transform,完成平移操作,affine:矩阵,translate:移动

        // 改变位置的四种方法:bounds/transform/frame/center

        uv.transform = CGAffineTransformTranslate(uv.transform, -50, 0);

        

        // 旋转: Rotate, 第一个参数是 uv 起始位置, M_PI/2 -> 90度

        uv.transform = CGAffineTransformRotate(uv.transform, M_PI/4);

        

        // 缩放, 后面两个参数代表 x、y 方向上的倍数

        uv.transform = CGAffineTransformScale(uv.transform, 0.5, 0.5);

        

        // 反转

        uv.transform = CGAffineTransformInvert(uv.transform);


        //设置uv 随子视图的变化而变化

        uv.autoresizesSubviews = YES;

        //设置uv 的子视图label 以何种模式适应父视图uv 的变化,带位移的枚举可用 | 等

        //    lb.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

        lb.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;


    <二>  CALayer 图层级别动画

    // 点击事件

    - (void)btnClick:(UIButton *)btn {

        // 初始化第二视图对象

        SecondViewController *secVC = [[SecondViewController alloc] init];

        

        // 创建自定义动画 CALayer 图层级别的

        // 过度动画

        CATransition *trans = [CATransition animation];

        // 动画持续时间

        [trans setDuration:2];

        // 设置动画的类型

        /*

         1.#define定义的常量

              kCATransitionFade   交叉淡化过渡

              kCATransitionMoveIn 新视图移到旧视图上面

              kCATransitionPush   新视图把旧视图推出去

              kCATransitionReveal 将旧视图移开,显示下面的新视图

           

         2.用字符串表示

              pageCurl            向上翻一页

              pageUnCurl          向下翻一页

              rippleEffect        滴水效

              suckEffect          收缩效果,如一块布被抽走

              cube                立方体效果

              oglFlip             上下翻转效果

         */

    //    [trans setType:@"cube"];

        [trans setType:@"pageCurl"];

        // 动画运动的方向

        [trans setSubtype:kCATransitionFromRight];

        // 把动画的效果添加到layer 上

        [self.view.window.layer addAnimation:trans forKey:@"animal"];

        

        // 以模态方式跳转到第二视图

        [self presentViewController:secVC animated:YES completion:^(void){

            NSLog(@"视图跳转完成");

        }];

        // 返回来用:dismissViewControllerAnimated:YES completion:nil

    }

     

  • 相关阅读:
    Vue项目里添加特殊字体或 某些字体乱码的问题
    Vue 事件修饰符
    js 判断是什么浏览器、是否为谷歌浏览器
    Vue 打印预览功能
    Vue v-if与v-show的区别
    js 下载文件/导出
    使用Mysql Workbench 导入数据库提示 ERROR 1227 (42000) at line 18: Access denied; you need (at least one of) the SUPER privilege(s) for
    java 使用注释校验数据有效性
    java poi分批次导入Excel
    浅谈java中源码常见的几个关键字(native,strictfp,transient,volatile)
  • 原文地址:https://www.cnblogs.com/arlenliu/p/5135942.html
Copyright © 2011-2022 走看看