您的位置:首页 > 移动开发 > IOS开发

iOS 开发学习之 User Interface(11)iOS事件处理机制及手势 与 MVC浅述

2016-01-17 17:51 501 查看
1. iOS事件处理机制

   iOS应用程序是事件驱动型的。

   分两步:a. 分发事件

               b. 响应事件

   [分发事件]

    在发生触摸后,事件加入到UIApplication事件队列(UIApplication接收消息,分发事件,它始终在循环监听用户操作),UIApplication从事件队列中取出最前面的事件进行分发处理。

    分发的顺序:从->window开始依次向上。

    分发的判断依据:判断触摸点是否在当前视图内:

    if ( 触摸点 in 当前视图 ){

遍历其子视图;

            递归判断触摸点是否在子视图上;

            一直遍历完所有子视图,找到直接与触摸相接的那个视图;

            /*判断过程中,若视图的的hidden= YES 或者 userInteractionEnabled = NO 或者 alpha < 0.1 ,会直接返回。

            一般UIView及其子类 userInteractionEnabled = YES, 个别为NO,如UILabel , UIImageView.

           */

      }

    else {

            直接返回;

     }

     [响应事件]

     找到触摸到的视图后,判断其是否实现了处理事件的方法。

     若未实现,则将事件向上传递,同样进行判断。

     若实现了,则停止传递。

     这个过程是在一个“响应链”中,要处理事件的视图,都有下一响应者,一直到顶端,若都没有实现处理事件的方法,则事件会被丢弃。

     UIApplicationDelegate
<- UIWindow <- UIViewController<- UIView
<- UIView;

2. 触摸事件处理

// 触摸开始

- (void)touchesBegan:(NSSet<UITouch
*> *)touches withEvent:(nullable
UIEvent *)event;

// 触摸移动

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullableUIEvent
*)event;

// 触摸结束

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullableUIEvent
*)event;

//触摸取消(因系统事件进入,如电话)

- (void)touchesCancelled:(nullableNSSet<UITouch *>
*)touches withEvent:(nullableUIEvent *)event;

   

   加速计(运动)处理

// 加速开始

- (void)motionBegan:(UIEventSubtype)motion withEvent:(nullableUIEvent
*)event NS_AVAILABLE_IOS(3_0);

 // 加速结束

  - (void)motionEnded:(UIEventSubtype)motion withEvent:(nullableUIEvent
*)event NS_AVAILABLE_IOS(3_0);

 // 加速取消

  - (void)motionCancelled:(UIEventSubtype)motion withEvent:(nullableUIEvent
*)event NS_AVAILABLE_IOS(3_0);

3. 手势

    触摸事件使用比较容易,但不易处理多个手指触摸时分辨不同的操作,由此引入手势识别,将用户常用的的手势操作封装成不同的类供使用。

    手势类:UIGestureRecognizer 是一个抽象类,是所有手势类的父类,定义了手势的基本行为。不能直接使用,只能使用其子类对象。

   常用手势类:

    UITapGestureRecognizer    // 点击

    UIPinchGestureRecognizer  // 捏合

    UIPanGestureRecognizer    // 拖曳

    UISwipeGestureRecognizer // 轻扫

    UIRotationGestureRecognizer // 旋转

    UILongPressGestureRecognizer // 长按

   手势类使用:

     > 初始化

     .. alloc] init]

     > 手势的属性(较少设置)

     .numberOfTapsRequired  // 点击次数

     .numberOfTouchesRequired // 需要几根手指点击

     > 添加/监听手势的触发

     addTarget:action:

     > 添加手势类对象到对应的视图上

     [view addGestureRecognizer:]

     >> 手势冲突

     //如果一个手势A的识别部分是另一个手势B的子部分时,默认情况下A就会先识别,B就无法识别了

    (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer

     >> 不同控件的手势同时执行,对于父子视图间的

     使用UIGestureRecognizerDelegate 

    (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer
*)otherGestureRecognizer


          /* 判断otherGestureRecognizer 的视图是哪一个,返回yes表示继续向下传递事件,否则不传递 */



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




MVC

   MVC是一种软件设计模式。广泛应用于用户交互的应用程序中。在iOS的开发中这种机制是处处都有体现。

   模型-视图-控制器(Model-View-Controller,MVC).

   模型对象:封装了应用程序的数据,并定义操控和处理该数据的逻辑和运算。

   视图对象: 是应用程序中用户可以看得见的对象。提供接口(界面)与用户交互。[所有控件,窗口都继承自UIView].

   控制器对象:在应用程序的一个或多个视图对象和一个或多个模型之间,控制器对象充当媒介。












MVC是一种软件设计模式。广泛应用于用户交互的应用程序中。在iOS的开发中这种机制是处处都有体现。

模型-视图-控制器(Model-View-Controller,MVC).

模型对象:封装了应用程序的数据,并定义操控和处理该数据的逻辑和运算。

视图对象: 是应用程序中用户可以看得见的对象。提供接口(界面)与用户交互。[所有控件,窗口都继承自UIView].

控制器对象:在应用程序的一个或多个视图对象和一个或多个模型之间,控制器对象充当媒介。

通信约束:

 Model和View永远不能相互通信,只能通过Controller传递。

 Controller可以直接与Model对话(读写Model),Model通过通知的形式与Controller 间接通信。

 Controller 可以直接与View对话,直接操作View. View 通过target-action形式,及delegate的形式与Controller间接通信。




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