2012-05-11 67 views
0

注意:这不是性能问题!我意识到在UITableView中出现单元出现的好处。为什么滚动UITableView比滚动UIScrollView响应更快?

为了测试我创建了一个UIScrollView与具有白色滚动视图黑色背景颜色一些简单的不透明的UIView子视图,以及它们之间的100点的间距,以便有东西滚动。非常轻量。没有其他的。真的相信我,它不重。

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

当我触摸滚动视图并立即开始拖动时,它落后了大约0.25秒,然后突然爬起来。从那里,它是流体,没有滞后,直到我再次触摸并再次触及。

,当我做同样的事情更,更大,更复杂的UITableView有它开始滚动前0.25秒无初始延迟。

我试图改变每一个可能的属性,但不能消除这个愚蠢的延迟。我相信这与滚动视图有关,如果触摸想要发生在子视图上,然后看到用户是否移动了它的手指太多。然后它开始滚动。

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

编辑:嘘......我发现一些疯狂!

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属性。最可疑的是带有delayedTouchesBegan的UIScrollViewDelayedTouchesBeganGestureRecognizer。该死的! 如何在iOS4中将其设置为

回答

2

编辑:

我找到了this answer in S.O

基本上,你可以尝试继承UIScrollView和压倒一切的touchesShouldCancelInContentView所以它总是返回NO:

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

上一个答案:

我试图改变每个属性的可能,但就是无法消除这种愚蠢的延迟。我相信这与滚动视图有关,如果触摸想要发生在子视图上,然后看到用户是否移动了它的手指太多。然后它开始滚动。

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

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

source

可能UITableView做一些事情来改变这种行为。

让您滚动查看第一个响应者:

[scrollView becomeFirstResponder] 

将无法​​正常工作,因为这只会影响非触摸事件的调度。

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

+0

好猜。我尝试禁用内部视图的用户交互,但没有效果。 –

+0

-TouchesShouldCancelInContentView:绝对没有效果。 –

0

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

+0

是的,这不是根本原因。 –