【问题标题】:UIPanGestureRecognizer.maximumNumberOfTouches not respected in nested scroll views?UIPanGestureRecognizer.maximumNumberOfTouches 在嵌套滚动视图中不受尊重?
【发布时间】:2012-02-09 16:00:48
【问题描述】:

我有一个根UIScrollView,它只能垂直滚动,这个滚动视图代表我锯齿状网格中的行。我已将此滚动视图的平移手势识别器配置为两次触摸,以满足最小和最大触摸次数要求。

在这个滚动视图中,我有一个或多个 UIScrollView 实例,它们只水平滚动,这些滚动视图每个都代表我锯齿状网格视图中的一行。我已将所有这些滚动视图的平移手势识别器配置为最少一次触摸,最多两次触摸。

到目前为止,它工作正常,我得到了一个很好的锯齿状网格视图,我可以在其中垂直滚动行之间,水平滚动独立滚动每一行。我有意将最小触摸次数设置为 2,以免在我添加例如 UITableView 作为此锯齿状网格视图中任何单元格的子视图(单元格 == 由一行定义的位置)时滚动和该行中的列)。

使用UITableView 作为单元格,表格视图按预期工作。但是用两根手指滚动也会在表格视图内滚动,而不是在根滚动视图以在行之间垂直滚动。

我尝试将表格视图平移手势识别器配置为最多允许一次触摸,希望忽略两个手指触摸。这不起作用,表格视图的平移手势识别器接缝的maximumNumberOfTouches 属性将被忽略。

我做错了什么?

显示布局的屏幕截图以阐明我所做的事情:

【问题讨论】:

  • 好问题。我正在解决一个类似的问题。滚动视图上的两指滑动手势。我可以将其优先于 panrecognizer,但滚动不流畅,因为在拖动时,系统会稍等片刻,看看它是否不是滑动手势。 panrecognizer 上的maximumNumberOfTouches 不起作用:(
  • tinypic 说你的照片被删除了...
  • 这似乎是一个普遍问题。我尝试将非嵌套滚动视图的 pangesturerecognizer 设置为 maximumNumberOfTouches 为 3,但它也不受尊重。还发现了这个雷达:github.com/lionheart/openradar-mirror/issues/1250

标签: ios cocoa-touch uiscrollview uikit uipangesturerecognizer


【解决方案1】:

多次滚动往往会变得棘手,我不确定,但我认为 Apple 不鼓励这样做。即便如此,我仍然认为这是可能的。可能是表格视图上的垂直滚动与滚动视图垂直滚动或其他东西混合在一起。

尝试检查手势识别器的代理是否设置正确。 解决这个问题的另一种方法是: - 有一个带有按钮的滚动视图,您可以从中打开带有自定义控制器的弹出框(插入任何您想要的内容)。 - 创建一个大的UITableViewController 并将单元格的内容设置为滚动视图等。我认为您可以获得相同的结果。

我的建议是不要拘泥于一种方法,因为可能还有其他更简单、更直观的方法。

【讨论】:

  • 手势识别器不是我的,它们归滚动视图所有,所以我不能触摸它们的代表,最好尽可能少触摸它们。这里的总体意图是实现一种新的包含视图控制器。每个网格中的子视图,例如小示例图像中的UITableViewController,如果可能的话,应该完全独立于网格视图控制器。
【解决方案2】:

滚动视图上的 TableViews 通常不是一个好主意。当 TableView 接收到触摸时,即使不需要对它做任何事情,它也不会将它们发送到它的 superView。

您可能想尝试以下两种方法中的任何一种:

  1. 在您的 TableView 中,您应该手动将触摸发送到您的 superView,并让它们适当地处理它们。我已经看到在我的一个副项目中使用了这种方法,但我目前无法发布它的示例。

  2. 第二件事可能更容易实现。由于 TableView 是 ScrollView 的子类,您可以调用这些 TableView 的 delaysContentTouches。此属性甚至会在该 TableView 上延迟触地,直到它可以确定滚动是否是意图,如 AppleDocs 中所述:http://developer.apple.com/library/ios/#documentation/uikit/reference/UIScrollView_Class/Reference/UIScrollView.html#//apple_ref/occ/cl/UIScrollView

如果这两种方法中的任何一种对你有用,请告诉我,我一般对这个主题很好奇。

【讨论】:

  • 您的两个解决方案都涉及入侵子视图,我想避免这种情况,因为它使孩子依赖于父母。所有触摸都正确转发到超级视图,只是表格视图忽略它的平移手势识别器的maximumNumberOfTouches 值,用两根手指触发平移,即使配置为最多允许1 根手指。
  • 你连他们的属性都不能设置?
【解决方案3】:

但是你不要尝试一些技巧而不是实现所有这些更改:

1) 默认情况下,在创建视图时禁用 TableView 的滚动

2) 生成视图后,识别手势是否使用单次或多次触摸滚动,如果用户触摸子滚动视图。注意标签,基于手势,您可以启用Tableview 的滚动。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
   //Get the tag of ScrollView 
   // Check for the Parent as well as Child SCrollview.
   // If its child, just enable the scrolling of tableView.
}

- (void)tapAction:(UIGestureRecognizer *)gestureRecognizer
{

//  CGPoint *poit = [Tile locationInView:gestureRecognizer.view];
/// [[[gestureRecognizers.view] objectAtIndex:0] removeFromSuperview];
//  imageContent = [[UIImageView alloc]initWithFrame:CGRec  tMake(0, 0, 200, 250)];
//  [imageContent setImage:[UIImage imageNamed:@"Default.png"]];

    NSLog(@"You tapped @ this :%d",gestureRecognizer.view.tag);
    //Regonize the gestures
}

可能有一些不必要的代码,因为您的问题没有代码 sn-p。我试了一下并展示了一个技巧,如果这对您有用并解决问题。 ;)

【讨论】:

  • 不,我没有尝试任何技巧。我访问公共panGestureRecognizers 并将它们配置为使用不同数量的所需触摸。而已。我的问题仍然是来自UITableView 的手势识别器忽略了它的maximumNumberOfTouches 属性。
【解决方案4】:

试试this link 并注意他们如何解决嵌套视图。

记住处理多点触控事件的最佳实践:

在处理事件(触摸事件和运动事件)时,您应该遵循一些推荐的技术和模式。

  • 始终实现事件取消方法。

在您的实现中,您应该将视图的状态恢复到当前多点触控序列之前的状态,释放为处理事件而设置的任何瞬态资源。如果您不实现取消方法,您的视图可能会处于不一致的状态。在某些情况下,另一个视图可能会收到取消消息。

  • 如果您在 UIView、UIViewController 或(在极少数情况下)UIResponder 的子类中处理事件,

    • 你应该实现所有的事件处理方法(即使它是一个空实现)。

    • 不要调用方法的超类实现。

  • 如果您在任何其他 UIKit 响应器类的子类中处理事件,

    • 您不必实现所有的事件处理方法。

    • 但是在你实现的方法中,一定要调用超类的实现。例如,

[super touchesBegan:theTouches withEvent:theEvent];

  • 不要将事件转发给 UIKit 框架的其他响应者对象。

您将事件转发到的响应者应该是您自己的 UIView 子类的实例,并且所有这些对象都必须知道正在发生事件转发,并且在触摸事件的情况下,它们可能会收到触摸不受约束。

  • 为响应事件而重绘自身的自定义视图应仅在事件处理方法中设置绘图状态,并在 drawRect: 方法中执行所有绘图。

  • 不要显式地向响应者发送事件(通过 nextResponder);相反,调用超类实现并让 UIKit 处理响应者链遍历。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多