01-UIView的拖拽
1.ios當(dāng)中常用的事件分為三種:
觸摸事件
加速計事件
遠(yuǎn)程控制事件
2.什么是響應(yīng)者對象?
繼承了UIResponds的對象我們稱它為響應(yīng)者對象
UIApplication、UIViewController、UIView都繼承自UIResponder
因此它們都是響應(yīng)者對象,都能夠接收并處理事件
3.為什么說繼承了UIResponder就能夠處理事件?
因為UIResponder內(nèi)部提供了以下方法來處理事件
比如觸摸事件會調(diào)用以下方法:
- (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;
加速計事件會調(diào)用:
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;
遠(yuǎn)程控制事件會調(diào)用:
- (void)remoteControlReceivedWithEvent:(UIEvent *)event;
4.如何監(jiān)聽UIView的觸摸事件?
想要監(jiān)聽UIViiew的觸摸事件,首先第一步要自定義UIView,
因為只有實現(xiàn)了UIResponder的事件方法才能夠監(jiān)聽事件.
UIView的觸摸事件主要有:
一根或者多根手指開始觸摸view,系統(tǒng)會自動調(diào)用view的下面方法.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
一根或者多根手指在view上移動時,系統(tǒng)會自動調(diào)用view的下面方法
(隨著手指的移動,會持續(xù)調(diào)用該方法,也就是說這個方法會調(diào)用很多次)
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
一根或者多根手指離開view,系統(tǒng)會自動調(diào)用view的下面方法
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
參數(shù)說明:
touches:
touches中存放的都是UITouch對象,它是一個NSSet集合.
UITouch對象它就是用來保存手指相關(guān)聯(lián)的信息.包括位置,時間,階段等信息.
每一個手指對應(yīng)著一個UITouch對象.
這個UITouch是系統(tǒng)自動幫我們創(chuàng)建的,當(dāng)手指移動時,系統(tǒng)會更新同一個UITouch對象,
使它能夠一直保存該手指在的觸摸位置
通過獲取UITouch屬性,我們可以獲得觸摸產(chǎn)生時所處的窗口,觸摸的View,時間,點擊的次數(shù)等,
這些都可以在通過UITouch獲取.
還可以通過UITouch提供的方法獲取當(dāng)前手指所在的點,以及上一個手指所在的點.
取當(dāng)前手指所在的點
- (CGPoint)locationInView:(UIView *)view;
獲取上一個觸摸點的位置.
- (CGPoint)previousLocationInView:(UIView *)view;
event:
每產(chǎn)生一個事件,就會產(chǎn)生一個UIEvent對象
UIEvent:稱為事件對象,記錄事件產(chǎn)生的時刻和類型
一次完整的觸摸過程,會經(jīng)歷3個狀態(tài):
觸摸開始:- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
觸摸移動:- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
觸摸結(jié)束:- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
觸摸取消(可能會經(jīng)歷):- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
一次完整的觸摸過程中,只會產(chǎn)生一個事件對象,4個觸摸方法都是同一個event參數(shù)
如果兩根手指同時觸摸一個view,那么view只會調(diào)用一次touchesBegan:withEvent:方法,touches參數(shù)中裝著2個UITouch對象
如果這兩根手指一前一后分開觸摸同一個view,那么view會分別調(diào)用2次touchesBegan:withEvent:方法,
并且每次調(diào)用時的touches參數(shù)中只包含一個UITouch對象
5.UIView拖拽思路?
1.自定義UIView,實現(xiàn)監(jiān)聽方法.
2.確定在TouchMove方法當(dāng)中進(jìn)行操作,因為用戶手指在視圖上移動的時候才需要移動視圖。
3.獲取當(dāng)前手指的位置和上一個手指的位置.
4.當(dāng)前視圖的位置 = 上一次視圖的位置 + 手指的偏移量
關(guān)健代碼實現(xiàn):
拿到UITouch就能獲取當(dāng)前點
UITouch *touch = [touches anyObject];
獲取當(dāng)前點
CGPoint curP = [touch locationInView:self];
獲取上一個點
CGPoint preP = [touch previousLocationInView:self];
獲取手指x軸偏移量
CGFloat offsetX = curP.x - preP.x;
獲取手指y軸偏移量
CGFloat offsetY = curP.y - preP.y;
移動當(dāng)前view
self.transform = CGAffineTransformTranslate(self.transform, offsetX, offsetY);