關於UIGestureRecognizer手勢與UITouch對象共存的一個問題

情景:本人接了一個需求,寫一個能夠點擊並能夠拖動的浮窗,一想很簡單,拖動能夠使用UITouch事件代理就能夠,點擊加一個UITapGestureRecognizer手勢動做。完成以後,發現當手拖動的時候UITouch事件會很快被cancel掉git

緣由解析

緣由是由於觸摸事件和手勢混合使用的一個優先級問題,手勢識別優先級高於UITouch事件,具體解析可詳看這裏:詳解iOS觸摸事件與手勢識別github

解決方案

由於手勢比觸摸事件的優先級高,因此將拖動的功能使用UIPanGestureRecognizer手勢bash

核心代碼

- (void)pan:(UIPanGestureRecognizer*)pan{
    
    if (!self.canMove) {
        return;
    }

    //求偏移量 = 手指當前點的X - 手指上一個點的X
    CGPoint pt = [pan translationInView:self];
    pan.view.center = CGPointMake(pan.view.center.x +pt.x , pan.view.center.y + pt.y);
    //每次移動完,將移動量置爲0,不然下次移動會加上此次移動量
    [pan setTranslation:CGPointMake(0, 0) inView:self];

    if (pan.state == UIGestureRecognizerStateEnded) {
        [self endTouch:pan.view.center];
    }
}
複製代碼
相關文章
相關標籤/搜索