如何通过平移手势限制可移动的视图

我有一个UIImageView可以通过平移手势移动。

 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; [self.photoMask addGestureRecognizer:pan]; 

我想限制可以在屏幕上移动的区域。 而不是用户能够将视图拖到屏幕的一侧,我想限制它的某种边缘。 我怎样才能做到这一点?

另外,这是如何处理时,旋转?

编辑—

 #pragma mark - Gesture Recognizer -(void)handlePan:(UIPanGestureRecognizer *)gesture { NSLog(@"Pan Gesture"); gesture.view.center = [gesture locationInView:self.view]; } 

这是我目前处理泛的方法。 我需要做的是继续移动中心点的图像视图,并限制其靠近屏幕边缘的运动,例如50。

一个可能的解决scheme是在你的handlePan方法中,检查屏幕上点的位置,并且只在你希望限制的范围内提交改变。

例如。

 -(void) handlePan:(UIGestureRecognizer*)panGes{ CGPoint point = [panGes locationInView:self.view]; //Only allow movement up to within 100 pixels of the right bound of the screen if (point.x < [UIScreen mainScreen].bounds.size.width - 100) { CGRect newframe = CGRectMake(point.x, point.y, theImageView.frame.size.width, theImageView.frame.size.height); theImageView.frame = newframe; } } 

我相信这也将正确处理任何屏幕旋转

编辑

要将图像视图移动到框架的中心, handlePan方法可能看起来像这样。

 -(void)handlePan:(UIPanGestureRecognizer *)gesture { CGPoint point = [gesture locationInView:self.view]; //Only allow movement up to within 50 pixels of the bounds of the screen //Ex. (IPhone 5) CGRect boundsRect = CGRectMake(50, 50, 220, 448); if (CGRectContainsPoint(boundsRect, point)) { imgView.center = point; } } 

检查点是否在您想要的范围内,如果是,请将图像视图框的中心设置为该点。

我不确定在这里是否过于简单化,但我认为你可以通过使用if子句来实现这一点。

 -(void)handlePan:(UIPanGestureRecognizer*)gesture { UIImageView *viewToDrag = gesture.view; // this is the view you want to move CGPoint translation = [gesture translationInView:viewToDrag.superview]; // get the movement delta CGRect movedFrame = CGRectOffset(viewToDrag.frame, translation.x, translation.y); // this is the new (moved) frame // Now this is the critical part because I don't know if your "margin" // is a CGRect or maybe some int values, the important thing here is // to compare if the "movedFrame" values are in the allowed movement area // Assuming that your margin is a CGRect you could do the following: if (CGRectContainsRect(yourPermissibleMargin, movedFrame)) { CGPoint newCenter = CGPointMake(CGRectGetMidX(movedFrame), CGRectGetMidY(movedFrame)); viewToDrag.center = newCenter; // Move your view } // -OR- // If you have your margins as int values you could do the following: if ( (movedFrame.origin.x + movedFrame.size.width) < 50) { CGPoint newCenter = CGPointMake(CGRectGetMidX(movedFrame), CGRectGetMidY(movedFrame)); viewToDrag.center = newCenter; // Move your view } } 

您可能需要调整以满足您的特定需求。

希望这可以帮助!

 - (void)dragAction:(UIPanGestureRecognizer *)gesture{ UILabel *label = (UILabel *)gesture.view; CGPoint translation = [gesture translationInView:label]; if (CGRectContainsPoint(label.frame, [gesture locationInView:label] )) { label.center = CGPointMake(label.center.x, label.center.y); [gesture setTranslation:CGPointZero inView:label]; } else{ label.center = CGPointMake(label.center.x, label.center.y + translation.y); [gesture setTranslation:CGPointZero inView:label]; } }