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

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间接通信。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值