情景:本人接了一個需求,寫一個能夠點擊並能夠拖動的浮窗,一想很簡單,拖動能夠使用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];
}
}
複製代碼