在 uiscrollview 中滑动无法正常工作

问题描述 投票:0回答:2

我有一个

UISrollView
,叫做
templateView
。我必须向其添加一个滑动手势,以允许用户向左/向右滑动以查看另一个模板。问题是大多数时候用户无法轻松滑动,因为视图向下/向上滚动而不是滑动到另一个视图。他的手指需要严格水平对齐才能滑动到另一个页面,从用户体验的角度来看这是不可接受的。

知道如何处理此类情况吗?有没有办法实现检测滑动手势的角度?或者,有没有办法将其作为自定义手势来检测具有特定角度的斜线?

提前致谢。

ios uiscrollview swipe
2个回答
4
投票

尝试实现 UIGestureRecognizer Delegate 方法。当gestureRecognizer或otherGestureRecognizer对手势的识别会阻止其他手势识别器识别其手势时,调用此方法。请注意,返回 YES 保证允许同时识别。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer  
    {
        return YES;
    }

参考: UIGestureRecognizer 协议

当您初始化滑动手势时,不要忘记分配委托。

更新 1 创建您自己的手势

您始终可以继承 UIGestureRecognizer 类并实现

touchesBegan
touchesMoved
touchesEnded
方法 - 根据您自己的需要手动管理手势的状态。

我发布了一些实现自定义 EdgeGestureRecognizer 的示例代码,以便您更好地理解。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];
    UITouch *touch = touches.anyObject;
    CGPoint location = [touches.anyObject locationInView:self.view];

    // if not single finger, then fail

    if ([touches count] != 1)
    {
        self.state = UIGestureRecognizerStateFailed;
        return;
    }
   //put here some logics for your case. For instance, you can register
   //here your first touch location, it will help
   //you to calculate the angle after.
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];

    if (self.state == UIGestureRecognizerStateFailed) return;

    UITouch *touch = touches.anyObject;
    self.previousPoint = self.currentPoint;
    self.previousPointTime = self.currentPointTime;
    self.currentPoint = [touch locationInView:self.view];
    self.currentPointTime = touch.timestamp;

    if (self.state == UIGestureRecognizerStatePossible)
    {
        CGPoint translate = CGPointMake(self.currentPoint.x - self.startPoint.x, self.currentPoint.y - self.startPoint.y);

        // see if we've moved the necessary minimum distance

        if (sqrt(translate.x * translate.x + translate.y * translate.y) >= self.minimumRecognitionDistance)
        {
            // recognize if the angle is roughly horizontal, otherwise fail

            double angle = atan2(translate.y, translate.x);

            if ([self isAngleCloseEnough:angle])
                self.state = UIGestureRecognizerStateBegan;
            else
                self.state = UIGestureRecognizerStateFailed;
        }
    }
    else if (self.state == UIGestureRecognizerStateBegan)
    {
        self.state = UIGestureRecognizerStateChanged;
    }
}

0
投票

即使在 swift UI 中的滚动视图上,这也适用于我,我遇到了同样的问题,即边缘滑动在滚动视图上不起作用:

extension UINavigationController: UIGestureRecognizerDelegate {
    override open func viewDidLoad() {
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = self
    }

    public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return viewControllers.count > 1
    }

    public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.