作者也是前不久開始接觸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的拖拽)
二母谎、響應(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
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))
四、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è)手勢
(代碼差不多,就不上了)
效果:
這是我的第一篇文杨帽,知識偏基礎(chǔ)叙赚、簡單胧砰,主要是想體驗(yàn)下寫文的方式,了解下markdown語法的使用乌妒,制作gif,制作概念圖槽唾,同時(shí)也記錄一下自己學(xué)習(xí)的內(nèi)容。
自己所在工作室的師兄都很厲害钝计,向他們學(xué)習(xí)hiahiahiahia本鸣。
文中若有知識漏洞,還請路過的讀者指正涮瞻,謝謝~