5

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

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

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

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

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

我做错了什么?

显示布局的屏幕截图以阐明我所做的事情: 锯齿状网格视图

4

4 回答 4

0

TableViews on Scroll views are generally not a great idea. When a TableView receives the touches, even if doesn't need to do anything with it, it won't send them to it's superView.

You might wanna try either of these 2 things:

  1. In your TableView you should send the touches to your superView manually and let them handle them appropriately. I've seen this method being used in one of my side-projects but I'm not able to post an example of it at this time.

  2. The second thing might be easier to implement. Since TableView is a subclass of ScrollView you can call upon the delaysContentTouches of those TableViews. This property will delay the touch-down even on that TableView until it can determine if scrolling is the intent, as is written in the AppleDocs: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIScrollView_Class/Reference/UIScrollView.html#//apple_ref/occ/cl/UIScrollView

Let me know if either of the 2 ways works for you, I'm quite curious about this subject generally.

于 2012-01-18T11:01:21.173 回答
0

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

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

我的建议是不要只停留在一种方法上,因为可能还有其他更简单、更直观的方法。

于 2012-01-13T12:57:11.393 回答
0

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

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

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

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

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

于 2012-01-18T12:46:41.527 回答
0

试试这个链接并注意他们如何解决嵌套视图。

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

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

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

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

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

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

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

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

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

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

[super touchesBegan:theTouches withEvent:theEvent];

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

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

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

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

于 2012-01-21T00:58:26.917 回答