iOS 個(gè)人總結(jié)-UIGestureRecognizer\響應(yīng)者鏈

作者也是前不久開始接觸iOS前联,若是路過的業(yè)界大佬似嗤,就此跳過吧。作者只想通過此文記錄一下最近在學(xué)習(xí)的內(nèi)容烁落,加深印象伤塌。


一每聪、UIResponder

以UIResponder作為超類的任何對象都可以成為響應(yīng)者齿风。UIView以及UIViewController都是UIResponder的子類救斑。
即UIView和UIViewcontroller及它們的子類都可以作為響應(yīng)者對象監(jiān)聽用戶手勢脸候。

注意
UIImageView 也可以作為響應(yīng)者,前提將其屬性userInteractionEnabled設(shè)置為YES;
imageView.userInteractionEnabled = YES;
由此注意點(diǎn)鄙煤,作者想到了當(dāng)一個(gè)view不能響應(yīng)事件的三種時(shí)機(jī):
userInteractionEnable = NO;hidden = YES;alpha = 0~0.01;


iOS中事件的類型:觸摸事件梯刚、加速計(jì)事件薪寓、遠(yuǎn)程控制事件

UIResponder中部分方法

//觸摸API
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
//按壓API
- (void)pressesBegan:(NSSet<UIPress *> *)presses withEvent:(nullable UIPressesEvent *)event
//加速API ?(微信搖一搖)
- (void)motionBegan:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event

然后通過touches中一個(gè)方法實(shí)現(xiàn)了一個(gè)小demo
代碼:

@implementation RedView
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //獲取touches中的任意UITouch對象
    //一個(gè)UITouch對象代表一個(gè)手指锥腻,其生命周期從手指接觸屏幕開始到手指離開屏幕結(jié)束
    UITouch *touch = [touches anyObject];
    CGPoint curPoint = [touch locationInView:self];
    CGPoint prePoint = [touch previousLocationInView:self];
    //計(jì)算相對位移
    CGFloat sx = curPoint.x - prePoint.x;
    CGFloat sy = curPoint.y - prePoint.y;
    self.transform = CGAffineTransformTranslate(self.transform, sx, sy);
}
@end

效果圖:(實(shí)現(xiàn)redView的拖拽)


QQ20180805-201621-HD.gif

二母谎、響應(yīng)者鏈

響應(yīng)者鏈?zhǔn)且粋€(gè)能夠響應(yīng)用戶事件的可變對象集合。

執(zhí)行機(jī)制:

如果響應(yīng)者不處理某個(gè)特殊事件匹摇,那么它通常會將事件傳遞到響應(yīng)者鏈的下一級甲葬。如果該鏈中下一個(gè)對象響應(yīng)此特殊事件经窖,則它會處理此事件画侣,并停止事件的傳遞過程。

當(dāng)發(fā)生一個(gè)觸摸事件后屿脐,系統(tǒng)會將事件加入到一個(gè)由UIApplication管理的事件隊(duì)列(FIFO原則)中的诵,UIApplication會從事件中取出最前面的事件西疤,并將事件分發(fā)下去以便處理休溶,主穿口會在視圖層次結(jié)構(gòu)中找到一個(gè)最合適的視圖來處理觸摸事件芭碍。

注意
1.尋找最合適的響應(yīng)者是從最底層往上找的孽尽,如 window —> view —> child View
2.響應(yīng)者鏈?zhǔn)菑淖钌蠈油讓觽鬟f的杉女,如 child view —> view —> view controller —> window —> Application

QQ20180805-205056.png

3.觸摸事件的傳遞是從父視圖傳遞給子視圖速勇。
4.如果一個(gè)父控件不能響應(yīng)事件烦磁,則其子視圖也不能響應(yīng)事件。


三个初、UIGestureRecognizer

相對于上述的方法乖寒,UIGestureRecognizer實(shí)現(xiàn)手勢更加方便,不需要另外創(chuàng)建一個(gè)子類院溺。

手勢類型

    UITapGestureRecognizer *tapGs;//點(diǎn)按手勢
    UILongPressGestureRecognizer *longPressGs;//長按手勢
    UIPanGestureRecognizer *panGs;//拖動手勢
    UISwipeGestureRecognizer *swipeGs;//輕掃手勢
    UIRotationGestureRecognizer *rotationGs;//旋轉(zhuǎn)手勢
    UIPinchGestureRecognizer *pinchGs;//捏合手勢

每種類型的手勢都有自己對應(yīng)的獨(dú)有屬性及方法,例如
UIPanGestureRecognizer中有如下(作者常用到)

- (void)setTranslation:(CGPoint)translation inView:(nullable UIView *)view;

又如UIPinchGestureRecognizer中
@property (nonatomic) CGFloat scale; //縮放比例
作者只是舉了兩個(gè)例子磅轻,在這里就不一一贅述

這里我就使用rotation手勢來實(shí)現(xiàn)一個(gè)旋轉(zhuǎn)(rotation):
代碼:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.pinkView.userInteractionEnabled  = YES;
    UIRotationGestureRecognizer *rotationGs = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationAction:)];
    [self.pinkView addGestureRecognizer:rotationGs];
}
- (void)rotationAction:(UIRotationGestureRecognizer *)rotationGs {
    self.pinkView.transform = CGAffineTransformRotate(self.pinkView.transform, rotationGs.rotation);
    //注意要重制rotation為0珍逸,否則rotation會累計(jì)
    [rotationGs setRotation:0];
}

效果圖:(實(shí)現(xiàn)ImageView旋轉(zhuǎn))


旋轉(zhuǎn)手勢.gif

四、UIGestureRecognizerDelegate

作者也只是列出了協(xié)議中的部分方法

//是否監(jiān)聽手勢
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;

// 是否允許同時(shí)支持多個(gè)手勢聋溜,默認(rèn)是不支持多個(gè)手勢
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

// 手指觸摸屏幕后回調(diào)的方法谆膳,手勢識別
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;

注意
iOS中默認(rèn)是不支持多個(gè)手勢,若要實(shí)現(xiàn)多個(gè)手勢撮躁,就要實(shí)現(xiàn)UIRegestureRecognizerDelegate中的一個(gè)方法

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
        return YES;
}

這里漱病,我就用協(xié)議使用了兩個(gè)手勢
(代碼差不多,就不上了)
效果:


旋轉(zhuǎn)&平移.gif

這是我的第一篇文杨帽,知識偏基礎(chǔ)叙赚、簡單胧砰,主要是想體驗(yàn)下寫文的方式,了解下markdown語法的使用乌妒,制作gif,制作概念圖槽唾,同時(shí)也記錄一下自己學(xué)習(xí)的內(nèi)容。
自己所在工作室的師兄都很厲害钝计,向他們學(xué)習(xí)hiahiahiahia本鸣。

文中若有知識漏洞,還請路過的讀者指正涮瞻,謝謝~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市家淤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖狠角,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡堂飞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門讳窟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谋右,“玉大人辈挂,你說我怎么就攤上這事。” “怎么了霉翔?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵壹店,是天一觀的道長。 經(jīng)常有香客問我蝌麸,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任迫肖,我火速辦了婚禮帐姻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蹲缠。我一直安慰自己,他們只是感情好派草,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著助琐,像睡著了一般蛆橡。 火紅的嫁衣襯著肌膚如雪靴拱。 梳的紋絲不亂的頭發(fā)上袜炕,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天溜在,我揣著相機(jī)與錄音,去河邊找鬼登刺。 笑死纸俭,一個(gè)胖子當(dāng)著我的面吹牛简珠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蹭劈,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疗绣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了铺韧?” 一聲冷哼從身側(cè)響起多矮,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后塔逃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讯壶,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年湾盗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伏蚊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡格粪,死狀恐怖躏吊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帐萎,我是刑警寧澤比伏,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站疆导,受9級特大地震影響赁项,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜澈段,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一悠菜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧败富,春花似錦悔醋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至充择,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匪蟀,已是汗流浹背椎麦。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留材彪,地道東北人观挎。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像段化,于是被迫代替她去往敵國和親嘁捷。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355