首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >三层潘手势识别混乱

三层潘手势识别混乱
EN

Stack Overflow用户
提问于 2013-05-21 14:47:46
回答 4查看 1.1K关注 0票数 6

在开发一个应用程序时,我遇到了一个问题,就是有太多的pan手势识别器。我的第一个pan手势识别器在MainViewController上,它是RecipeSearchVC的父级。这个手势识别器向左或向右滑动整个视图。我的第二个pan手势识别器在RecipeSearchParametersVC中,它是parent的父级。第三个pan手势识别器被添加到一个嵌套在视图控制器内的UIControl轮上,该视图控制器由PageViewController表示。

我知道这听起来很疯狂,有人会说这是糟糕的设计。不过,我相信,这是一致的工作,它将是好的。

当试图旋转车轮时,在手势被PageViewController或MainViewController超越之前,它会旋转一两秒钟。通常情况下,接过的是MainViewController。我能用什么技术来区分每一个手势识别器?

编辑:

对于我的描述在涉及到潘手势识别器时的含糊之处表示歉意。MainViewController有自己的UIPanGestureRecpgniser,允许它向左或向右移动所有东西。RecipeSearchParametersVC只有一个UIPanGestureRecogniser,因为它包含UIPageViewController。它不添加手势识别器本身,而只是从pageViewController中获取它们。UIControl的手势识别器允许它跟踪它应该经历的旋转。

在接受建议时,我可以从页面视图控制器中删除手势,并用按钮替换它们。我只打算像在iBooks中发现的图像那样工作(可以滚动以显示更多的图像),所以我认为它会工作得很好。

UIControl UIPanGestureRecogniser代码

代码语言:javascript
复制
/**
 *  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;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-28 09:19:33

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

MainViewController和UIPanGestureRecogniser保持原样。带有UIPageViewController的UIControl已移动到单独的静态视图控制器。

这样做的效果要好得多,但还不理想。UIPageViewController会窃取任何水平的摇摄,但是这很可能是通过实现按钮来代替滚动来解决的。

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

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

票数 2
EN

Stack Overflow用户

发布于 2013-05-21 15:03:09

您将需要添加一个容器到车轮,然后您可以这样做,如果我没有遗漏什么,这段代码必须工作。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-05-21 15:03:56

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

虽然从技术上讲,这是正确的,但它可能会引起一些混乱,例如,如果您有几个重叠视图(这里有3个视图),并且需要将一个触摸发送到视图堆栈顶部的视图,那么会发生什么呢?这一姿态最终可能会让人感到困惑。

相反,可以将单个手势识别器附加到多个目标视图的superview,并根据用户所接触的位置的坐标将手势委托给正确的视图。为此,您需要规范化来自定义UIPanGesture的superview的任何子视图的触摸坐标。这样,你就可以知道锅在哪里发生在方向盘或其他地方。

PS:这么说,我强烈地觉得这是一个设计上的难题,它会伤害你。我做过这样的事情,但最终你会发现某个角落的情况,用户的交互将是可怕的。如果这是您的应用程序的主要视图,我建议您重新考虑设计。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16672955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档