#01-UIView的拖拽#

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);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,161評論 4 61
  • 很久以前 母親為我 種下一棵芒果樹 她說 讓樹與你同長吧 看誰最先成熟 我在長 樹也長 我變高 樹長闊 如...
    唯一還是我閱讀 239評論 0 1
  • 你突然的出現(xiàn)我沒有防備 你是誰的騎士欲做誰護(hù)衛(wèi) 心里要相遇或者與誰作對 全部放到一邊而選擇頹廢 想問問對不對悔不悔...
    青菜蘿卜豆腐湯閱讀 536評論 2 0
  • 假如我是一株草 我想永遠(yuǎn)守候那一寸貪瘠的土地 用薄弱的身軀抵擋風(fēng)雨 我想永遠(yuǎn)給這一寸土地陪襯 用一絲綠茵添補一角 ...
    ID夢哥閱讀 386評論 0 1
  • 我時?;孟胛視癯艘粯?,出現(xiàn)在各種困難的情景中,人們無法解決的問題,等我去搭救。事實上,我在自我幻想中,一路勇往...
    隔壁村的教主閱讀 856評論 1 2

友情鏈接更多精彩內(nèi)容