iOS 开发学习之 User Interface(5)UIView 与 UIViewController【二】

UIViewController 生命周期

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


         

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

- (void)loadView {

    [super loadView];

    // 加载视图

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

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

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

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

}


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

- (void)viewDidLoad {

    [superviewDidLoad];

    // Do any additional setup after loading the view.

    

    self.view.backgroundColor = [UIColorredColor];

    // 添加一个按钮

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

    [self.viewaddSubview:btn];

    btn.backgroundColor = [UIColorblueColor];

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

    [btn setTitleColor:[UIColorwhiteColor]forState:UIControlStateNormal];

    [btn addTarget:selfaction:@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             上下翻转效果

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

    // 先获取当前视图控制器的父容器的所有子视图控制器

    NSArray *arr =self.parentViewController.childViewControllers;

    // 通过本视图控制器的父容器将当前视图切换成下一视图

    [self.parentViewControllertransitionFromViewController:selftoViewController:arr[1]duration:2options:UIViewAnimationOptionTransitionFlipFromLeftanimations:nilcompletion:nil];



自定义容器视图控制器

    方法,属性:

       指定一个视图控制器作为容器视图控制器

       addChildViewController:                     // 在容器视图控制器里添加子视图控制器

       removeFromParentViewController        // 从容器视图控制器里脱离

       view.addSubview:

       transitionFromViewController:toViewController:duration:options:animations:completion:

       // 从一个视图控制器跳转到另一个视图控制器       

       .childViewControllers                          // 容器视图控制器的所有子视图控制器

       .parentViewController                         // 子视图控制器的父视图控制器


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

动画

<一>  UIView(UIViewAnimation) 类方法


+ (void)beginAnimations:(nullableNSString *)animationID context:(nullablevoid *)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:(nullableid)delegate;                         // default = nil

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

+ (void)setAnimationDidStopSelector:(nullableSEL)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))actionsWithoutAnimationNS_AVAILABLE_IOS(7_0);


案例一:

    //取出动画对象, uv

    UIView *uv = [self.viewviewWithTag:1];

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

    [UIViewbeginAnimations:@"first_ani"context:nil];

    // 设置动画的持续时间

    [UIViewsetAnimationDuration:5.0];

    // 动画延时

    [UIViewsetAnimationDelay:5];

    // 动画执行的次数

    [UIViewsetAnimationRepeatCount:2];

    

    //

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

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

    uv.backgroundColor = [UIColorblackColor];

    uv.layer.cornerRadius =20;

    // 转圈

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

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

    

    // 提交动画,使其执行

    [UIViewcommitAnimations];


案例二:

    UIView *uv = [self.viewviewWithTag: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的形式创建动画

    [UIViewanimateWithDuration:2delay:0options:UIViewAnimationOptionCurveEaseInanimations:blockcompletion:^(BOOL finished){

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

        

        [UIViewanimateWithDuration:1animations:^(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);

    

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

    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 = [[SecondViewControlleralloc]init];

    

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

    // 过度动画

    CATransition *trans = [CATransitionanimation];

    // 动画持续时间

    [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.layeraddAnimation:transforKey:@"animal"];

    

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

    [selfpresentViewController:secVCanimated:YEScompletion:^(void){

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

    }];

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

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值