Ios 刷卡不';在UIScroll视图中无法正常工作

Ios 刷卡不';在UIScroll视图中无法正常工作,ios,uiscrollview,swipe,Ios,Uiscrollview,Swipe,我有一个名为templateView的UISrollView。我必须添加一个滑动手势,允许用户向左/向右滑动以查看其他模板。问题是,大多数情况下用户无法轻松滑动,因为视图会向下/向上滚动,而不是滑动到另一个视图。他的手指需要严格水平对齐才能滑动到另一个页面,从用户体验的角度来看,这是不可接受的 你知道如何处理这些案件吗?有没有办法实现一个角度来检测刷卡手势?或者,有没有一种方法可以作为一种定制的手势来检测具有特定角度的斜线 提前感谢。尝试实现UIgestureRecognitor委托方法。当手势

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

你知道如何处理这些案件吗?有没有办法实现一个角度来检测刷卡手势?或者,有没有一种方法可以作为一种定制的手势来检测具有特定角度的斜线


提前感谢。

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

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer  
    {
        return YES;
    }
参考资料:

初始化滑动手势时,不要忘记指定代理

更新1创建自己的手势

您始终可以将UIgestureRecognitor类划分为子类,并实现
触摸开始
触摸移动
触摸结束
方法-根据您自己的需要手动管理手势的状态

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

- (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;
    }
}

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

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer  
    {
        return YES;
    }
参考资料:

初始化滑动手势时,不要忘记指定代理

更新1创建自己的手势

您始终可以将UIgestureRecognitor类划分为子类,并实现
触摸开始
触摸移动
触摸结束
方法-根据您自己的需要手动管理手势的状态

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

- (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;
    }
}

事实上,我已经试过了,但它并没有改善刷卡功能。这个问题与同时识别两个手势无关,因为目前它们被正确识别,但我的要求是如何改进它,以使其对用户更敏感,这样用户在浏览视图时不会遇到任何问题。还有一种方法,将模板视图构造为另一个具有分页启用模式的水平滚动视图。有很多种方法,请在你的问题中更具体一些。发布一些代码,发布一些屏幕截图,更详细地说明你想要实现什么。我认为还不够清楚。让我退后。这样做的目的是使滑动功能在UIScrollView中顺利工作。我知道我们可以同时支持这两种功能,并且可以正常工作,但只有当用户的手指严格水平滑动时,滑动才能工作。那是我的问题。我正在寻找一种增强此功能的方法。例如,我现在尝试在UIScrollView中添加一个对角滑动手势。我希望现在已经足够清楚了。这几乎就是我所做的。Thanks@Maystro,这就是为什么强烈建议发布一些显示您所做工作的代码。那样的话,帮助你就容易多了。快乐的编码,先生。事实上,我已经试过了,但它并没有改善刷卡功能。这个问题与同时识别两个手势无关,因为目前它们被正确识别,但我的要求是如何改进它,以使其对用户更敏感,这样用户在浏览视图时不会遇到任何问题。还有一种方法,将模板视图构造为另一个具有分页启用模式的水平滚动视图。有很多种方法,请在你的问题中更具体一些。发布一些代码,发布一些屏幕截图,更详细地说明你想要实现什么。我认为还不够清楚。让我退后。这样做的目的是使滑动功能在UIScrollView中顺利工作。我知道我们可以同时支持这两种功能,并且可以正常工作,但只有当用户的手指严格水平滑动时,滑动才能工作。那是我的问题。我正在寻找一种增强此功能的方法。例如,我现在尝试在UIScrollView中添加一个对角滑动手势。我希望现在已经足够清楚了。这几乎就是我所做的。Thanks@Maystro,这就是为什么强烈建议发布一些显示您所做工作的代码。那样的话,帮助你就容易多了。祝您愉快,先生。