• [iOS UI进阶


    A.需要掌握和练习的
    1.介绍事件类型
    2.通过按钮的事件处理引出view的事件处理
    3.响应者对象 --> UIResponder --> UIView
    4.view的拖拽
    * 实现触摸方法,打印查看
    * 介绍touches和UIEvent参数
    * 扩展:点哪去哪
    5.涂鸦
    6.手势解锁
    7.事件的产生和传递
    8.响应者链条
    9.手势
     
    B.概念
    1.iOS有3种主要事件
    • 触摸事件
    • 加速计事件
    • 远程控制事件
     
    2.响应者对象
         在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件。我们称之为“响应者对象”
       UIApplication、UIViewController、UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件
     
    3.UIResponder
    UIResponder内部提供了以下方法来处理事件
    触摸事件
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
    - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

    加速计事件
    - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
    - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;
    - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;

    远程控制事件
    - (void)remoteControlReceivedWithEvent:(UIEvent *)event;
     
    5.UIView的触摸事件处理
    UIView是UIResponder的子类,可以覆盖下列4个方法处理不同的触摸事件
    一根或者多根手指开始触摸view,系统会自动调用view的下面方法
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

    一根或者多根手指在view上移动,系统会自动调用view的下面方法(随着手指的移动,会持续调用该方法)
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

    一根或者多根手指离开view,系统会自动调用view的下面方法
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

    触摸结束前,某个系统事件(例如电话呼入)会打断触摸过程,系统会自动调用view的下面方法
    - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

    提示:touches中存放的都是UITouch对象
     
    6.UITouch
    当用户用一根手指触摸屏幕时,会创建一个与手指相关联的UITouch对象

    一根手指对应一个UITouch对象

    UITouch的作用
    保存着跟手指相关的信息,比如触摸的位置、时间、阶段

    当手指移动时,系统会更新同一个UITouch对象,使之能够一直保存该手指在的触摸位置

    当手指离开屏幕时,系统会销毁相应的UITouch对象

    提示:iPhone开发中,要避免使用双击事件!
     
    7.UITouch属性
    触摸产生时所处的窗口
    @property(nonatomic,readonly,retain) UIWindow    *window;

    触摸产生时所处的视图
    @property(nonatomic,readonly,retain) UIView      *view;

    短时间内点按屏幕的次数,可以根据tapCount判断单击、双击或更多的点击
    @property(nonatomic,readonly) NSUInteger          tapCount;

    记录了触摸事件产生或变化时的时间,单位是秒
    @property(nonatomic,readonly) NSTimeInterval      timestamp;

    当前触摸事件所处的状态
    @property(nonatomic,readonly) UITouchPhase        phase;
     
    8.UITouch方法
    - (CGPoint)locationInView:(UIView *)view;
    返回值表示触摸在view上的位置
    这里返回的位置是针对view的坐标系的(以view的左上角为原点(0, 0))
    调用时传入的view参数为nil的话,返回的是触摸点在UIWindow的位置

    - (CGPoint)previousLocationInView:(UIView *)view;
    该方法记录了前一个触摸点的位置
     
    9.UIEvent
    每产生一个事件,就会产生一个UIEvent对象

    UIEvent:称为事件对象,记录事件产生的时刻和类型

    常见属性
    事件类型
    @property(nonatomic,readonly) UIEventType    type;
    @property(nonatomic,readonly) UIEventSubtype  subtype;

    事件产生的时间
    @property(nonatomic,readonly) NSTimeInterval  timestamp;

    UIEvent还提供了相应的方法可以获得在某个view上面的触摸对象(UITouch)
     
    10.touches 和 event 参数
    一次完整的触摸过程,会经历3个状态:
    触摸开始:- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    触摸移动:- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    触摸结束:- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
    触摸取消(可能会经历):- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

    4个触摸事件处理方法中,都有NSSet *touches和UIEvent *event两个参数
    一次完整的触摸过程中,只会产生一个事件对象,4个触摸方法都是同一个event参数

    如果两根手指同时触摸一个view,那么view只会调用一次touchesBegan:withEvent:方法,touches参数中装着2个UITouch对象

    如果这两根手指一前一后分开触摸同一个view,那么view会分别调用2次touchesBegan:withEvent:方法,并且每次调用时的touches参数中只包含一个UITouch对象

    根据touches中UITouch的个数可以判断出是单点触摸还是多点触摸
     
    11.事件的产生和传递
     
    12.可以拖动的UIView
    可以拖曳的UIView色块
    Image(10)
     
     
    Image(11)
     
     1 //
     2 //  MoveView.m
     3 //  TouchMove
     4 //
     5 //  Created by hellovoidworld on 15/1/10.
     6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
     7 //
     8 
     9 #import "MoveView.h"
    10 
    11 @implementation MoveView
    12 
    13 /** 正在拖曳 */
    14 - (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    15     // 取得当前的touch对象
    16     UITouch *touch = [touches anyObject];
    17    
    18     // 上一个位置
    19     CGPoint prep = [touch previousLocationInView:self];
    20     // 现在位置
    21     CGPoint p = [touch locationInView:self];
    22     // 现在的x坐标
    23     CGFloat x = self.frame.origin.x + (p.x - prep.x);
    24     // 现在的y坐标
    25     CGFloat y = self.frame.origin.y + (p.y - prep.y);
    26     // 改变位置
    27     self.frame = CGRectMake(x, y, self.frame.size.width, self.frame.size.height);
    28 }
    29 
    30 @end
    31  
  • 相关阅读:
    结构体和枚举
    [转载]玩转Asp.net MVC 的八个扩展点
    SQLServer处理亿万级别的数据的优化措施
    Lambda表达式
    匿名类型
    单例模式——懒汉式和饿汉式详解
    Cglib动态代理实现原理
    集合的子集
    深入剖析ThreadLocal
    java注解的自定义和使用
  • 原文地址:https://www.cnblogs.com/hellovoidworld/p/4215518.html
Copyright © 2020-2023  润新知