UIGestureRecognizer是一個定義基本手勢的抽象類,具體包含:
1、拍擊UITapGestureRecognizer (任意次數的拍擊)
2、向裡或向外捏UIPinchGestureRecognizer (用於縮放)
3、搖動或者拖拽UIPanGestureRecognizer (拖動)
4、擦碰UISwipeGestureRecognizer (以任意方向)
5、旋轉UIRotationGestureRecognizer (手指朝相反方向移動)
6、長按UILongPressGestureRecognizer (長按)
本文主要使用到的是拖拽手勢:UIPanGestureRecognizer
限制方法:
-(void)doMoveAction:(UIPanGestureRecognizer *)recognizer{ // Figure out where the user is trying to drag the view. CGPoint translation = [recognizer translationInView:self.view]; CGPoint newCenter = CGPointMake(recognizer.view.center.x+ translation.x, recognizer.view.center.y + translation.y);// 限制屏幕范圍: newCenter.y = MAX(recognizer.view.frame.size.height/2, newCenter.y); newCenter.y = MIN(self.view.frame.size.height - recognizer.view.frame.size.height/2, newCenter.y); newCenter.x = MAX(recognizer.view.frame.size.width/2, newCenter.x); newCenter.x = MIN(self.view.frame.size.width - recognizer.view.frame.size.width/2,newCenter.x); recognizer.view.center = newCenter; [recognizer setTranslation:CGPointZero inView:self.view]; }
也可以使用UITouch來實現:
當手指接觸到屏幕,不管是單點觸摸還是多點觸摸,事件都會開始,直到用戶所有的手指都離開屏幕。期間所有的UITouch對象都被包含在UIEvent事件對象中,由程序分發給處理者。事件記錄了這個周期中所有觸摸對象狀態的變化。
限制方法如下:
BOOL isMove; CGPoint legend_point; -(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event{ [super touchesBegan:touches withEvent:event]; isMove = NO; UITouch *touch = [touches anyObject]; CGPoint point = [touch locationInView:self.view]; if (CGRectContainsPoint(V2.frame, point)) { legend_point = [touch locationInView:V2]; isMove = YES; } } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ [super touchesMoved:touches withEvent:event]; if (!isMove) { return; } @autoreleasepool { UITouch *touch = [touches anyObject]; CGPoint point = [touch locationInView:self.view]; //轉化成相對的中心 point.x += V2.frame.size.width/2.0f - legend_point.x; point.y += V2.frame.size.height/2.0f - legend_point.y; // 限制范圍 if (point.x < V2.frame.size.width / 2.0f) { point.x = V2.frame.size.width / 2.0f; } if (point.y < V2.frame.size.height / 2.0f) { point.y = V2.frame.size.height / 2.0f; } if (point.x > self.view.frame.size.width - V2.frame.size.width / 2.0f) { point.x = self.view.frame.size.width - V2.frame.size.width / 2.0f; } if (point.y > self.view.frame.size.height - V2.frame.size.height / 2.0f) { point.y = self.view.frame.size.height - V2.frame.size.height / 2.0f; } V2.center = point; } }
效果如圖:
Demo下載地址:https://github.com/sinceresk/MoveView