zoukankan      html  css  js  c++  java
  • [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  
  • 相关阅读:
    【HDOJ】2267 How Many People Can Survive
    【HDOJ】2268 How To Use The Car
    【HDOJ】2266 How Many Equations Can You Find
    【POJ】2278 DNA Sequence
    【ZOJ】3430 Detect the Virus
    【HDOJ】2896 病毒侵袭
    求奇数的乘积
    平方和与立方和
    求数列的和
    水仙花数
  • 原文地址:https://www.cnblogs.com/hellovoidworld/p/4215518.html
Copyright © 2011-2022 走看看