三层滑动手势识别器混淆问题

6

我应用视图层次结构的草图

在开发一个应用程序时,我遇到了一个问题,即手势识别器过多。第一个手势识别器位于MainViewController中,它是RecipeSearchVC的父级。这个手势识别器可以使整个视图左右滑动。第二个手势识别器位于RecipeSearchParametersVC中,它是一个页面视图控制器的父级。第三个手势识别器被添加到一个UIControl Wheel中,它嵌套在由PageViewController表示的视图控制器中。

我知道这听起来很疯狂,也可以说这是设计不良。然而,我相信如果能够有机地协同工作,那么这将是可以接受的。

当尝试旋转轮子时,在手势被PageViewController或MainViewController接管之前,它会旋转一两秒钟。往往是MainViewController接管得更多。我应该采取什么技术手段来清晰地区分每个手势识别器?

编辑:

对于我的手势识别器的描述过于含糊,我向大家道歉。 MainViewController有自己的UIPanGestureRecogniser,可以使其向左或向右移动所有内容。 RecipeSearchParametersVC只有一个UIPanGestureRecogniser,因为它包含一个UIPageViewController。它并没有添加手势识别器,而是从pageViewController中获取它们。 UIControl的手势识别器允许它跟踪应该发生的旋转。

根据所给的建议,我可能会从页面视图控制器中删除手势,并用按钮替换它们。我只希望它能像在iBooks中找到的图片一样工作(可以滚动以显示更多的图片),所以我认为这应该没问题。

UIControl UIPanGestureRecogniser Code

/**
 *  sent to the control when a touch related to the given event enters the control’s bounds
 *
 *  @param  touch                       uitouch object that represents a touch on the receiving control during tracking
 *  @param  event                       event object encapsulating the information specific to the user event
 */
- (BOOL)beginTrackingWithTouch:(UITouch *)touch
                     withEvent:(UIEvent *)event
{
    [super beginTrackingWithTouch:touch withEvent:event];

    CGPoint touchPoint                  = [touch locationInView:self];

    //  filter out touchs too close to centre of wheel
    CGFloat magnitudeFromCentre         = [self calculateDistanceFromCentre:touchPoint];

    if (magnitudeFromCentre < 40)       return NO;

    //  calculate distance from centre
    CGFloat deltaX                      = touchPoint.x - _container.center.x;
    CGFloat deltaY                      = touchPoint.y - _container.center.y;

    //  calculate the arctangent of the opposite (y axis) over the adjacent (x axis) to get the angle
    _deltaAngle                         = atan2(deltaY, deltaX);

    _startTransform                     = _container.transform;

    //  selection in limbo so set all sector image's to minimum value by changing current one
    [self getSectorByValue:_currentSector].alpha = kMinimumAlpha;

    return YES;
}

你能解决你的问题吗? - rog
4个回答

2

不幸的是,由于我的控制器层次结构的性质,我被迫重新思考我的应用程序的设计。

MainViewController与UIPanGestureRecogniser保持不变。 UIPageViewController与UIControl已经移动到一个单独的静态视图控制器中。

这样做效果要好得多,但还不完美。 UIPageViewController会夺取任何水平滑动,不过可以通过实现按钮作为滚动的替代品来解决这个问题。

UIControl没有手势识别器,但我覆盖了beginTrackingWithTouch:和其他方法来跟踪触摸。

我想答案应该是:如果你叠加太多手势,那么你的做法就错了。


0

你需要向轮子添加一个容器,然后你可以像这样做,如果我没有漏掉什么,这段代码应该可以工作。

UIPanGestureRecognizer* pan1 = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan1:)];
[self.view addGestureRecognizer:pan1];
UIPanGestureRecognizer* pan2 = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan2:)];
[view2 addGestureRecognizer:pan2];
UIPanGestureRecognizer* pan3 = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan3:)];
[view3 addGestureRecognizer:pan3];

- (void) pan1:(UIPanGestureRecognizer*)sender{
    NSLog(@"%@",sender);
}

- (void) pan2:(UIPanGestureRecognizer*)sender{
    NSLog(@"%@",sender);
}

- (void) pan3:(UIPanGestureRecognizer*)sender{
    NSLog(@"%@",sender);
}

0
有什么技巧可以用来清晰地区分这些手势识别器吗?
你应该研究UIGestureRecognizerDelegate方法:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 

询问委托是否允许两个手势识别器同时识别手势。
当gestureRecognizer或otherGestureRecognizer的手势识别会阻止另一个手势识别器识别其手势时,将调用此方法。请注意,返回YES保证允许同时识别;另一方面,返回NO不能保证防止同时识别,因为另一个手势识别器的委托可能会返回YES。
我相信这将解决手势被其他手势“占用”的问题。

0

我相信你已经定义了3个不同的UIPanGesture对象并将其附加到适当的视图上。

尽管从技术上讲这是正确的,但它可能会导致一些混淆。例如,如果您有几个重叠的视图(这里有3个),并且需要将触摸发送到不在视图堆栈顶部的视图,会发生什么?手势可能会变得混乱。

相反,可以将单个手势识别器附加到多个目标视图的父视图上,并根据用户触摸的坐标将手势委托给正确的视图。为此,您需要将任何子视图起源的触摸坐标归一化到定义UIPanGesture的父视图中。这样,您就可以知道滑动发生在轮子或其他地方的位置。

PS:话虽如此,我强烈感觉这是一个设计陷阱,它会伤害你。我做过类似的事情,但最终您会遇到一些边角案例,用户交互会很糟糕。如果这是您应用程序的主视图,建议您重新考虑设计。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接