为什么滚动UITableView比滚动UIScrollView更具响应性?

时间:2012-05-11 10:23:14

标签: ios uitableview uiscrollview

注意:这不是性能问题!我知道UITableView中单元格出列的好处。

为了测试我创建了一个UIScrollView,其中包含一些简单的不透明UIView子视图,它们在白色滚动视图上具有黑色背景颜色,并且它们之间有100个点间距,因此可以滚动。非常轻。没有其他的。真的相信我,它并不重。

我注意到开始滚动滚动视图和开始滚动表格视图之间存在巨大差异。

当我触摸滚动视图并立即开始拖动时,它会滞后约0.25秒然后突然赶上。从那里开始,它是流动的,没有滞后,直到我再次触摸并再次触地。

在一个更大,更大,更复杂的UITableView上,当我做同样的事情时,在开始滚动之前没有0.25秒的初始​​延迟。

我试图改变每一个可能的财产,但却无法消除这种愚蠢的延迟。我相信它与滚动视图有关,想要弄清楚触摸是否意味着在子视图上发生,然后看到用户是否过多地移动它的手指。然后它开始滚动。

现在疯狂的事情是UITableView是一个UIScrollView本身,我想让我的UIScrollView开始滚动像UITableView一样快。怎么样?

编辑: Sh ..我发现了一些疯狂的东西!

NSLog(@"GR = %@", self.gestureRecognizers);


GR = (

"<UIScrollViewDelayedTouchesBeganGestureRecognizer: 0x13e930; 
state = Possible; 
delaysTouchesBegan = YES; 
view = <TestScrollView 0x13e380>; 
target= <(action=delayed:, target=<TestScrollView 0x13e380>)>>",

"<UIScrollViewPanGestureRecognizer: 0x13ee00; 
state = Possible; 
delaysTouchesEnded = NO; 
view = <TestScrollView 0x13e380>; 
target= <(action=handlePan:, target=<TestScrollView 0x13e380>)>>"

)

这是iOS 4,iOS4中没有panGestureRecognizer属性。最可疑的是UIScrollViewDelayedTouchesBeganGestureRecognizer和delayedTouchesBegan。该死的! 如何在iOS4中将其设置为 NO

2 个答案:

答案 0 :(得分:1)

编辑:

我找到了this answer in S.O

基本上,您可以尝试子类化UIScrollView并覆盖touchesShouldCancelInContentView,以便它始终返回NO:

- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
      return NO;
}

PREV ANSWER:

  

我试图改变每一个可能的财产,但却无法消除这种愚蠢的延迟。我相信它与滚动视图有关,想要弄清楚触摸是否意味着在子视图上发生,然后看到用户是否过多地移动它的手指。然后它开始滚动。

我认为这是正确的假设。实际上,响应者链和事件管理的设计工作方式是最具体的视图是接收事件通知的视图;在此过程中,响应者链中的每个视图都会被询问,直到找到最深的视图。

  

触摸事件。窗口对象使用命中测试和响应者链来查找接收触摸事件的视图。在命中测试中,窗口在视图层次结构的最顶层视图上调用hitTest:withEvent:此方法通过在视图层次结构中返回YES的每个视图上递归调用pointInside:withEvent:继续执行,继续向下移动层次结构,直到找到触摸发生在其边界内的子视图。该视图成为热门测试视图。

source

可能UITableView会改变这种行为。

将滚动视图设为第一响应者:

 [scrollView becomeFirstResponder]

不起作用,因为这只会影响非触摸事件的发送。

您可以尝试使内部视图不启用触摸,看看是否有所作为。

答案 1 :(得分:0)

你试过subViews.userInteractionEnabled = NO;吗?这将有助于消除触摸假设。