您的位置:首页 > 产品设计 > UI/UE

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

2016-01-16 16:31 639 查看
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);

    

   
// 缩放,后面两个参数代表 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 = [[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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS