(七) IOS 響應(yīng)者鏈和手勢

響應(yīng)者鏈(面試常問)和手勢(只是一些方法)

一皂贩、事件傳遞

1栖榨、從事件發(fā)生到其處理的對象,傳遞要經(jīng)過特殊的一段過程先紫,當(dāng)用戶點擊設(shè)備屏幕時治泥,iOS捕捉到一系列的觸摸,將其打包到UIEvent對象并放置到應(yīng)用程序活動事件隊列中遮精。

2居夹、UIApplication對象從事件隊列中取出最前面的事件并將其分發(fā),通常本冲,其將事件發(fā)送給應(yīng)用程序的主窗口-UIWindow實例准脂,再由窗口對象發(fā)送事件給第一響應(yīng)者處理,一般通過touchesBegan方法獲取該事件

3檬洞、具體過程

 1)先將事件對象由上往下傳遞(由父控件傳遞給子控件)狸膏,找到最合適的控件來處理這個事件

 2)調(diào)用最合適控件的touches方法

 3)如果調(diào)用了[super touches...]方法,就會將事件順著"響應(yīng)者鏈條"往上傳遞添怔,傳遞給上一個響應(yīng)者

 4)接著就會調(diào)用上一個響應(yīng)者的touches...方法

二湾戳、響應(yīng)者鏈

1、基本概念

  響應(yīng)者對象是一個能接受并處理事件的對象广料,UIResponser是所有響應(yīng)者對象的基類砾脑,該基類定義了一系列編程接口,不但為事件處理進(jìn)行服務(wù)而且還提供了通用的響應(yīng)行為處理艾杏,UIApplication韧衣、UIView(UIWindow)、UIViewController都直接或間接的繼承自UIResponser,所有的這些類的實例都是響應(yīng)者對象

  響應(yīng)者鏈表示一系列的響應(yīng)者對象,事件被交由第一響應(yīng)者對象處理畅铭,如果第一響應(yīng)者不處理氏淑,事件被沿著響應(yīng)者鏈向上傳遞,交給下一個響應(yīng)者(nextresponder)

2硕噩、事件響應(yīng)者鏈傳遞的過程(從下往上找)

  1假残、當(dāng)用戶與試圖交互時,會將消息傳遞給試圖控制器榴徐,如果不存在控制器守问,傳遞給父試圖

  2、如果不處理該消息坑资,則繼續(xù)將消息向上傳遞耗帕,如果最上層的試圖也不處理,將事件交給window對象袱贮,最后交由UIApplication實例仿便,如果不處理,丟棄事件

  PS:傳遞方式

   [self.nextResponder touchesBegan:touches withEvent:event];

3攒巍、通過響應(yīng)者鏈傳遞可以讓多個試圖響應(yīng)同一個手勢

四嗽仪、手勢識別器(在第五部分給大家具體的實例講解)

UIGestureRecognizer類,用于檢測柒莉、識別用戶使用設(shè)備時所用的手勢闻坚,他是一個抽象類,定義了所有手勢的基本行為兢孝,以下是UIGestureRecognizer子類窿凤,用與處理具體的用戶手勢行為

1、輕擊
 
  UITapGestureRecognizer
 
  常用屬性
    
    //點擊次數(shù)
    numberOfTapsRequired

    //消除兩個手勢的影響
    requireGestureRecognizerToFail

    //手指的數(shù)量跨蟹,需將試圖的multipleTouchEnabled設(shè)為YES
    numberOfTouchesRequired

2雳殊、輕掃

  UISwipeGestureRecognizer

  常用屬性

   清掃方向,默認(rèn)是右
   direction

3窗轩、長按
   
   UILongPressGestureRecognizer

   常用屬性

    最小長按時間
    minimumPressDuration

   注意事項

    如果不判斷會調(diào)用2次 按下2秒后自己調(diào)用一次 松開后又要調(diào)用一次

     if (longPress.state == UIGestureRecognizerStateEnded) {
      return;
     }
     NSLog(@"長按");

4夯秃、平移

  UIPanGestureRecognizer

  常用方法

    獲取觸摸的位置
    locationInView

    注意事項


      - (void)panAction:(UIPanGestureRecognizer *)gesture{

        // 1.在view上面挪動的距離 //translationInView表示相對于起點挪動的位置是最新2點之間的間距
        CGPoint translation = [gesture translationInView:gesture.view];
        CGPoint center = gesture.view.center;
        center.x += translation.x;
        center.y += translation.y;
        gesture.view.center = center;

        // 2.清空移動的距離
        [gesture setTranslation:CGPointZero inView:gesture.view];

      }

5、捏合

  UIPinchGestureRecognizer

  注意事項:

   每次調(diào)用過方法后痢艺,記得將scale置1仓洼,否則你的圖片在捏合一點便會變很大或很小

6、旋轉(zhuǎn)

  UIRotationGestureRecognizer

  注意事項:

   每次調(diào)用過方法后堤舒,記得將rotation置0色建,否則圖片旋轉(zhuǎn)不正常

7、手勢識別器的代理方法

 /**
  *  是否允許多個手勢識別器同時有效
  *  Simultaneously : 同時地
  */
  - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
  {
      return YES;
  }

8植酥、重要的事情說三遍

  實現(xiàn)旋轉(zhuǎn)、縮放、平移的時候一定要清零

  實現(xiàn)旋轉(zhuǎn)友驮、縮放漂羊、平移的時候一定要清零

  實現(xiàn)旋轉(zhuǎn)、縮放卸留、平移的時候一定要清零

五具體的實例講解

  #import "ViewController.h"

  @interface ViewController ()<UIGestureRecognizerDelegate>
  {

       UIImageView *imageView;
  }
   @end

  @implementation ViewController

  - (void)viewDidLoad {
  [super viewDidLoad];

  imageView = [[UIImageView alloc]initWithFrame:self.view.frame];

  imageView.image = [UIImage imageNamed:@"minion"];

  imageView.userInteractionEnabled = YES;

  [self.view addSubview:imageView];

  #pragma mark 1.輕擊

  UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)];

  tapGesture.numberOfTapsRequired = 1;

  [imageView addGestureRecognizer:tapGesture];//添加手勢

  #pragma mark 2.雙擊

   UITapGestureRecognizer *doubleGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(doubleclick:)];

   doubleGesture.numberOfTapsRequired = 2;

  [tapGesture  requireGestureRecognizerToFail:doubleGesture];

  //消除兩個手勢的影響
  [imageView addGestureRecognizer:doubleGesture];

  #pragma mark  3.兩個手指同時點擊

  UITapGestureRecognizer *doubleTouchAndClick = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(doubleTouchAndClick:)];

  doubleTouchAndClick.numberOfTouchesRequired = 2;
  doubleTouchAndClick.numberOfTapsRequired = 2;

  [imageView addGestureRecognizer:doubleTouchAndClick];

  #pragma mark 4.清掃(就一個屬性 direction)

UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipe)];

//設(shè)置清掃的對象

swipeGesture.direction = UISwipeGestureRecognizerDirectionDown;

//添加手勢

[imageView addGestureRecognizer:swipeGesture];

#pragma mark  5.長按

UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressGesture:)];

//長按的一個屬性:長按最小時間
longPressGesture.minimumPressDuration = 2;

[imageView addGestureRecognizer:longPressGesture];


#pragma mark  6.平移

UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGesture:)];

[imageView addGestureRecognizer:panGesture];

#pragma mark  7.捏合


UIPinchGestureRecognizer *pinGesture = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinGesture:)];

pinGesture.delegate = self;

[imageView addGestureRecognizer:pinGesture];

#pragma mark  8.旋轉(zhuǎn)

UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotationGesture:)];

rotationGesture.delegate = self;

 [imageView addGestureRecognizer:rotationGesture];

}

// 1.輕擊

-(void)tap:(UITapGestureRecognizer *)gesture
{
NSLog(@"輕擊");
}

//2.雙擊
-(void)doubleclick:(UITapGestureRecognizer *)gesture
{
  NSLog(@"雙擊");
}

//3.兩個手指同時點擊

 -(void)doubleTouchAndClick:(UITapGestureRecognizer *)gesture
 {
    NSLog(@"同時雙擊");
 }
//4.清掃
-(void)swipe
{

   NSLog(@"清掃");

}

//5.長按

-(void)longPressGesture:(UILongPressGestureRecognizer *)gesture
{

if (gesture.state == UIGestureRecognizerStateEnded) {
    return;
}
NSLog(@"長按");

}

//6.平移
-(void)panGesture:(UIPanGestureRecognizer *)gesture
{

// 1.在view上面挪動的距離 //translationInView表示相對于起點挪動的位置是最新2點之間的間距
CGPoint translation = [gesture translationInView:gesture.view];
CGPoint center = gesture.view.center;
center.x += translation.x;
center.y += translation.y;
gesture.view.center = center;

// 2.清空移動的距離
[gesture setTranslation:CGPointZero inView:gesture.view];

 }

 //7.捏合

 -(void)pinGesture:(UIPinchGestureRecognizer *)gesture
 {
     imageView.transform = CGAffineTransformScale(imageView.transform, gesture.scale, gesture.scale);

     NSLog(@"%f",gesture.scale);
     gesture.scale = 1;
 }

 //8.旋轉(zhuǎn)

 - (void)rotationGesture:(UIRotationGestureRecognizer *)gesture
 {

     imageView.transform = CGAffineTransformRotate(imageView.transform, gesture.rotation);

     gesture.rotation = 0;

  }

 //9走越、手勢識別器的代理方法

 /**
 *  是否允許多個手勢識別器同時有效
 *  Simultaneously : 同時地
 */
 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
  {

    return YES;
 
  }

 @end

六.希望大家喜歡

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市耻瑟,隨后出現(xiàn)的幾起案子旨指,更是在濱河造成了極大的恐慌,老刑警劉巖喳整,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谆构,死亡現(xiàn)場離奇詭異,居然都是意外死亡框都,警方通過查閱死者的電腦和手機搬素,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魏保,“玉大人熬尺,你說我怎么就攤上這事∥铰蓿” “怎么了粱哼?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長檩咱。 經(jīng)常有香客問我揭措,道長,這世上最難降的妖魔是什么税手? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任蜂筹,我火速辦了婚禮,結(jié)果婚禮上芦倒,老公的妹妹穿的比我還像新娘艺挪。我一直安慰自己,他們只是感情好兵扬,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布麻裳。 她就那樣靜靜地躺著,像睡著了一般器钟。 火紅的嫁衣襯著肌膚如雪津坑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天傲霸,我揣著相機與錄音疆瑰,去河邊找鬼眉反。 笑死,一個胖子當(dāng)著我的面吹牛穆役,可吹牛的內(nèi)容都是我干的寸五。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耿币,長吁一口氣:“原來是場噩夢啊……” “哼梳杏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淹接,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤十性,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后塑悼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劲适,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年拢肆,在試婚紗的時候發(fā)現(xiàn)自己被綠了减响。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡郭怪,死狀恐怖支示,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鄙才,我是刑警寧澤颂鸿,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站攒庵,受9級特大地震影響嘴纺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浓冒,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一栽渴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧稳懒,春花似錦闲擦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至或油,卻和暖如春寞忿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顶岸。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工腔彰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叫编,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓霹抛,卻偏偏與公主長得像宵溅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子上炎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 好奇觸摸事件是如何從屏幕轉(zhuǎn)移到APP內(nèi)的?困惑于Cell怎么突然不能點擊了雏搂?糾結(jié)于如何實現(xiàn)這個奇葩響應(yīng)需求藕施?亦或是...
    Lotheve閱讀 57,088評論 51 599
  • 在iOS開發(fā)中經(jīng)常會涉及到觸摸事件。本想自己總結(jié)一下凸郑,但是遇到了這篇文章裳食,感覺總結(jié)的已經(jīng)很到位,特此轉(zhuǎn)載芙沥。作者:L...
    WQ_UESTC閱讀 6,010評論 4 26
  • 在開發(fā)過程中诲祸,大家或多或少的都會碰到令人頭疼的手勢沖突問題,正好前兩天碰到一個類似的bug而昨,于是借著這個機會了解了...
    閆仕偉閱讀 5,330評論 2 23
  • 一歌憨、事件 1着憨、在iOS上,事件有多種形式 1)觸摸事件 2)運動事件 3)遠(yuǎn)程控制事件 2务嫡、UIView不接收觸摸...
    空白Null閱讀 884評論 0 2
  • 值得注意的事,當(dāng)一個view上面有多個手勢時,touch是無序的 1事件是怎么樣產(chǎn)生與傳遞的?(由上至下的過程) ...
    池鵬程閱讀 2,246評論 0 8