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

}

 

 

posted @ 2016-01-16 18:02  守木  阅读(202)  评论(0编辑  收藏  举报