将UIView移动限制为垂直或水平轴

我正在使用PanGestureRecognizer,并在UIGestureRecognizerStateChanged我让屏幕上的视图被用户的手指移动。 我正在使用这样的Tinder类似滑动手势,现在我想限制视图的移动到水平轴或垂直轴,无论用户开始滑动什么方向。 我一直在寻找,但没有find适合的地方。

根据用户开始滑动视图的方向,是否有任何巧妙的方法来限制轴的移动?

谢谢一堆!

更新:这是当前移动视图的代码:

- (void)dragged:(UIPanGestureRecognizer *)gestureRecognizer { CGFloat xDistance = [gestureRecognizer translationInView:self].x; CGFloat yDistance = [gestureRecognizer translationInView:self].y; // xDistance = 0; [parentView dragged:yDistance]; switch (gestureRecognizer.state) { case UIGestureRecognizerStateBegan:{ self.originalPoint = self.center; break; }; case UIGestureRecognizerStateChanged:{ CGFloat rotationAngel = 0; CGFloat scale = 1;//MAX(scaleStrength, 0.93); CGAffineTransform transform = CGAffineTransformMakeRotation(rotationAngel); CGAffineTransform scaleTransform = CGAffineTransformScale(transform, scale, scale); self.transform = scaleTransform; self.center = CGPointMake(self.originalPoint.x + xDistance, self.originalPoint.y + yDistance); ... break; }; case UIGestureRecognizerStateEnded: { float moveDistAction = 60; if (yDistance > moveDistAction) { // view swiped down ... } else if (yDistance < -moveDistAction) {//100 150 // view swiped up ... } else { // dragging cancelled ... } break; }; case UIGestureRecognizerStatePossible:break; case UIGestureRecognizerStateCancelled:break; case UIGestureRecognizerStateFailed:break; } } 

gestureRecognizerShouldBegin:你可以知道这个方向:

 - (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer { CGPoint translation = [gestureRecognizer translationInView:self.view]; self.isVerticalPan = fabs(translation.y) > fabs(translation.x); // BOOL property return YES; } 

然后在UIGestureRecognizerStateChanged你可以做这样的事情,基于isVerticalPan属性:

 CGPoint translation = [gesture translationInView:self.view]; CGPoint displacement = (self.isVerticalPan) ? CGPointMake(0, translation.y) : CGPointMake(translation.x, 0); self.viewToMove.transform = CGAffineTransformMakeTranslation(displacement.x, displacement.y); 

你可以通过实现gestureRecognizerShouldBegin: delegate方法来做到这一点。 在下面的实现中,我正在检查大约20度的水平滑动。 但是,你可以检查水平或垂直滑动。 (我会用一些小angular度,因为用户很难直线移动。)

 - (BOOL) gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { // Ensure that the user is only panning mostly horizontally // This allows the view to be placed in a scrollview that scrolls vertically // Up/Down drags in the body of the view will be passed to the scroll view if (gestureRecognizer == self.panGesture) { CGPoint velocity = [self.panGesture velocityInView:self.panGesture.view]; double radian = atan(velocity.y/velocity.x); double degree = radian * 180 / M_PI; double thresholdAngle = 20.0; if (fabs(degree) > thresholdAngle) { return NO; } } return YES; } 

免责声明:我很确定我在这里find了这个解决scheme,但我找不到它。 所以,道歉原来的解决这个…