天天看點

01-事件處理簡介/UIView拖拽

1.ios當中常見的事件?

        觸摸事件

        加速計事件

        遠端控制事件

2.什麼是響應者對象?

    繼承了UIResponds的對象我們稱它為響應者對象 UIApplication、UIViewController、UIView都繼承 UIResponder,是以它們都是響應者對象,都能夠接收并處理事件.

3.為什麼說繼承了UIResponder就能夠處理事件?

原因:因為UIResponder内部提供了以下方法來處理事件.

    如觸摸事件會調用以下方法:

    - (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;

    加速計事件會調用:

    - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;

    - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;

    - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;

  遠端控制事件會調 :

    - (void)remoteControlReceivedWithEvent:(UIEvent *)event;

4.如何監聽UIView的觸摸事件?

    想要監聽UIViiew的觸摸事件, 先第一步要自定義UIView, 因為隻有實作了UIResponder的事件方法才能夠監聽事件.

    UIView的觸摸事件主要有:

    1)單根或者多根手指開始觸摸view,系統會自動調用view的下方法.

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

     2)單根或者多根手指在view上移動時,系統會自動調用view的下列方法 (随着手指的移動,會持續調用該方法,也就是說這個方法會調用很多次)

    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

     3)單根或者多根手指離開view,系統會自動調用view的下列方法

    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

5.UIView拖拽思路?

    1.定義UIView,實作監聽方法.

    2.确定在TouchMove方法當中進行操作,因為使用者手指在視圖上移動的時候才需要移動視圖。

    3.擷取目前手指的位置和上一個手指的位置.

    4.目前視圖的位置 = 上一次視圖的位置 - 手指的偏移量

6.實作關鍵代碼:

    當手指在螢幕上移動時持續調用

    NSSet: 它的元素都是無序的.

    NSArray: 它的是有順序的.

    -(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    1.擷取手指的對象

    UITouch *touch = [touches anyObject];

    2.擷取目前手指所在的點.

    CGPoint curP = [touch locationInView:self];

    3.擷取手指的上一個點.

    CGPoint preP = [touch previousLocationInView:self];

    //X軸方向偏移量

    CGFloat offsetX = curP.x - preP.x;

    //Y軸方向偏移量

    CGFloat offsetY = curP.y - preP.y;

    CGAffineTransformMakeTranslation:

    //會清空上一次的形變,相對初始位置進行形變.

    self.transform = CGAffineTransformMakeTranslation(offsetX,0);

    //相對上一次的位置進行形變.

    self.transform = CGAffineTransformTranslate(self.transform, offsetX, offsetY);

    }

轉載于:https://www.cnblogs.com/zhoudaquan/p/5037386.html