UIView 面面观

原创:转载请注明出处

1.UIView: 一个视图对象控制该区域的渲染,同时也控制内容的交互。

 

2.UIView的功能就是:展示、渲染、交互

 

3.UIView 和很多其他视图控件的默认tag值是0,所以我们设定tag值时一定不能取0 ,实际应用中一般使用宏定义设定tag值以方便管理

 

4.UIViewController 的功能倾向于管理、切换、传递

 

5.视图也可以客串视图控制器的角色,但对于复杂的功能,使用视图控制器能更好地掌控视图的层次和生命周期。尤其是很多视图控制器封装了各自独特的功能

 

6.UIViewController 生命周期

- (void)viewDidLoad{

    [super viewDidLoad];

}

 

- (void)viewWillAppear:(BOOL)animated{

    [super viewWillAppear:animated];

}

 

- (void)viewWillLayoutSubviews{

    [super viewWillLayoutSubviews];

}

 

- (void)viewDidLayoutSubviews{

    [super viewDidLayoutSubviews];

}

 

- (void)viewDidAppear:(BOOL)animated{

    [super viewDidAppear:animated];

}

 

- (void)viewWillDisappear:(BOOL)animated{

    [super viewWillDisappear:animated];

}

 

- (void)viewDidDisappear:(BOOL)animated{

    [super viewDidDisappear:animated];

}

 

- (void)didReceiveMemoryWarning{

    [super didReceiveMemoryWarning];

}

 

//支持转屏

- (BOOL)shouldAutorotate{

    return YES;

}

//支持转屏的方向

- (UIInterfaceOrientationMask)supportedInterfaceOrientations{

    return UIInterfaceOrientationMaskPortrait;

}

 

7.视图控制中期的切换由一个视图控制器切换到另一个视图控制器有很多种方法;如:[self  addChildViewController: test]; 如果参数中的视图控制器已经有了父控制器,它将先从父控制器中移除 。一般情况下,我们在切换视图控制器的同时进行视图的切换

 

8.每个导航控制器都有一个根视图控制器,推送到一个视图控制器,会进行界面的控制权的移交,但是上一个控制器存在于栈中,不会释放

 

9.直接在AppDelegate中构建导航控制器是一个不错的选择,这样我们就可以在程序的任何视图控制器中做推送,并且使用UINavigationController自带的动画

[(UINavigationController *) [UIApplication sharedApplication].keyWindow.rootViewController pushViewController:viewController animated:YES];

 

10.UIView 类定义了几个内在支持动画的属性声明,当这些属性发生改变时,视图为其变化提供内建的动画支持

frame ————视图的边框矩形,位于父视图的坐标系中 

bounds ———— 视图的边界矩形,位于视图的坐标系中

center ————— 边框的中心,位于父视图的坐标系中

transform —————视图上的转换矩阵,相对于视图边界的中心

alpha———————视图的alpha,用于确定视图的透明度

 

11.UIView动画作为一个完整的事务一次性运行,它不会阻塞主线程,它是在独立的线程中执行 的。正在执行动画的视图是无法交互的,若想实现交互,可改变UIViewAnimationOptionAllowUserInteraction的值

动画快可以被嵌套,但是在最外层的动画块提交之前,被嵌套的动画不会被执行

UIView类方法配置动画参数

+ (void)setAnimationStartDate:(NSDate *)startDate;    //设置动画在commitAnimation方法返回之后的发生日期。缺省行为是使动画立即在动画线程中执行

实例:      

    /**

     *  调用UIGraphicsGetCurrentContext() 会返回当前视图堆栈顶部的图形上下文,图形上下文在抽象的绘图调用和屏幕(或图像)实际的像素之间建立一种虚拟的链接,传递一个nil给这个函数,也不会产生错误的结果 */

    CGContextRef context = UIGraphicsGetCurrentContext();

    //动画块调用开始

    [UIView beginAnimations:nil context:context];

    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    [UIView setAnimationDuration:2.0];

    [self.view setAlpha:0.9f];

    //动画块提交——--> > UIKit执行动画

    [UIView commitAnimations];

 

注:UIKit在一个独立的和应用程序的主事件循环分离的线程中执行动画。commitAnimations 方法将动画发送到该线程,动画随之进入线程中的队列,直到被执行。缺省情况下,只有在当前正在运行的动画块执行完成后,Core Animation 才会启动队列中的动画。但可通过动画块中+ (void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState; 方法重载这个行为,使动画立即启动。这样会停止当前正在执行的动画,从而使新动画在当前状态下开始执行; + (void)setAnimationsEnabled:(BOOL)enabled;  方法可暂时禁止动画

 

 

12.动画回调:视图动画可通知其委托:当前状态的改变,即动画已经开始或结束。在需要捕获动画结束事件并开始序列中下一段动画时这个功能非常有用。

+ (void)setAnimationDelegate:(nullable id)delegate;    设置委托方法

 

注:

默认情况下动画结束后会会触发下面的方法

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag; //finished这个参数表示动画是否正常结束

动画开始时会触发下面的方法

- (void)animationDidStart:(CAAnimation *)anim;

 

若要设置手动回调就要提供要发送给委托的选择器

+ (void)setAnimationWillStartSelector:(nullable SEL)selector;  

+ (void)setAnimationDidStopSelector:(nullable SEL)selector;   

 

 

13.过渡动画

+ (void)setAnimationTransition:(UIViewAnimationTransition)transition forView:(UIView *)view cache:(BOOL)cache;  // current limitation - only one per begin/commit block  —>指定该动画块的过渡效果

 

14.触摸

所有视图类都可以对触摸做出响应,触摸事件从视图最外层往下传递,直到某个视图接受并处理该事件。触摸事件将会触发如下5个回调方法

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event; //用户开始触摸屏幕

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event; //用户在屏幕上移动手指

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event; //用户手指离开屏幕

- (void)touchesCancelled:(nullable NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event; //触摸事件意外中断,(如程序退出)

- (void)touchesEstimatedPropertiesUpdated:(NSSet * _Nonnull)touches NS_AVAILABLE_IOS(9_1); //9.1之后加入的3D触摸事件

     

15.手势  UIGestureRecognizer的衍生类

UITapGestureRecognizer  — 点击手势

UIPinchGestureRecognizer  — 两个手指往内或往外波动手势

UIRotationGestureRecognizer  —旋转手势

UISwipeGestureRecognizer    —-滑动、快速移动手势

UIPanGestureRecognizer —- 拖动。慢速移动手势

UILongPressGestureRecognizer  — 长按手势

 

16.手势状态:

typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
    UIGestureRecognizerStatePossible,   //>>默认,尚未识别
    UIGestureRecognizerStateBegan,      //>>手势开始,已被识别(瞬间)
    UIGestureRecognizerStateChanged,    //>>手势状态发生变化
    UIGestureRecognizerStateEnded,      //>>手势识别操作完成(已松开手指)
    UIGestureRecognizerStateCancelled,  //>>手势被取消,恢复默认
    UIGestureRecognizerStateFailed,     //>>手势识别失败,恢复默认
    UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded

 

注:有不对和不足的地方请多留言指教!

posted on 2016-03-14 15:46  Jenaral  阅读(200)  评论(0编辑  收藏  举报

导航