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

Mar*_*ltz 2 objective-c swipe ios

我正在使用PanGestureRecognizer,在UIGestureRecognizerStateChanged中,我让用户手指移动屏幕上的视图.我正在使用它作为Tinder,如滑动手势,我现在想要限制视图移动到水平轴或垂直轴,无论用户开始滑动的方向.我一直在上下搜索,但在这里找不到合适的东西.

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

谢谢你!

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

- (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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Gor*_*rka 5

gestureRecognizerShouldBegin:你可以知道方向:

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

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

然后在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);
Run Code Online (Sandbox Code Playgroud)