你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開發 - 響應者鏈觸摸事件

iOS開發 - 響應者鏈觸摸事件

編輯:IOS開發綜合

觸摸事件

在用戶使用app過程中,會產生各種各樣的事件

iOS中的事件可以分為3大類型

觸摸事件:
加速計事件:
遠程控制事件:

響應者對象

在iOS中不是任何對象都能處理事件,只有繼承了UIResponder的對象才能接收並處理事件。我們稱之為“響應者對象”

UIApplication、UIViewController、UIView都繼承自UIResponder,因此它們都是響應者對象,都能夠接收並處理事件

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;

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對象

UITouch

當用戶用一根手指觸摸屏幕時,會創建一個與手指相關聯的UITouch對象

一根手指對應一個UITouch對象

UITouch的作用
保存著跟手指相關的信息,比如觸摸的位置、時間、階段

當手指移動時,系統會更新同一個UITouch對象,使之能夠一直保存該手指在的觸摸位置

當手指離開屏幕時,系統會銷毀相應的UITouch對象

提示:iPhone開發中,要避免使用雙擊事件!
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;

UITouch方法

- (CGPoint)locationInView:(UIView *)view;
返回值表示觸摸在view上的位置
這裡返回的位置是針對view的坐標系的(以view的左上角為原點(0, 0))
調用時傳入的view參數為nil的話,返回的是觸摸點在UIWindow的位置

- (CGPoint)previousLocationInView:(UIView *)view;
該方法記錄了前一個觸摸點的位置

UIEvent

每產生一個事件,就會產生一個UIEvent對象

UIEvent:稱為事件對象,記錄事件產生的時刻和類型

常見屬性
事件類型
@property(nonatomic,readonly) UIEventType     type;
@property(nonatomic,readonly) UIEventSubtype  subtype;

事件產生的時間
@property(nonatomic,readonly) NSTimeInterval  timestamp;

UIEvent還提供了相應的方法可以獲得在某個view上面的觸摸對象(UITouch)

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的個數可以判斷出是單點觸摸還是多點觸摸

觸摸事件實例


#import "TouchView.h"

@implementation TouchView

// 一個完整的觸摸過程:touchesBegan -> touchesMoved -> touchesEnded

/**
 *  觸摸開始(手指剛碰到view)
 */
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//    event.type

    // 隨機取一個對象
    UITouch *touch = [touches anyObject];

    NSLog(@"touchesBegan--%d", touches.count);

    NSLog(@"%d", touch.tapCount);
}

/**
 *  觸摸ing(手指在view上面挪來挪去)
 */
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    // 當前觸摸點
    CGPoint current = [touch locationInView:self];
    // 上一個觸摸點
    CGPoint previous = [touch previousLocationInView:self];

    // 修改當前view的位置(中點)
    CGPoint center = self.center;
    center.x += current.x - previous.x;
    center.y += current.y - previous.y;
    self.center = center;
}

/**
 *  觸摸結束(手指離開view)
 */
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
//    UITouch *touch = [touches anyObject];
//    NSLog(@"touchesEnded--%d", touches.count);
}


@end
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved