gpt4 book ai didi

ios - 为什么滚动 UITableView 比滚动 UIScrollView 响应更快?

转载 作者:行者123 更新时间:2023-11-29 13:36:00 26 4
gpt4 key购买 nike

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

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

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

当我触及 ScrollView 并立即开始拖动时,它滞后了大约 0.25 秒,然后突然 catch 了。从那里它是流畅的,不再有滞后,直到我再次触摸和触摸。

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

我试图改变所有可能的属性,但就是无法消除这种愚蠢的延迟。我相信这与 ScrollView 有关,它想弄清楚是否要在 subview 上发生触摸,然后查看用户是否过多地移动了手指。然后开始滚动。

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

最佳答案

编辑:

我找到了 this answer in S.O .

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

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

上一个答案:

I tried to alter every property possible but just cannot eliminate this stupid delay. I believe it has to do with the scroll view wanting to figure out if a touch is meant to happen on a subview, and then sees if user moves it's finger too much. Then it begins scrolling.

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

Touch events. The window object uses hit-testing and the responder chain to find the view to receive the touch event. In hit-testing, a window calls hitTest:withEvent: on the top-most view of the view hierarchy; this method proceeds by recursively calling pointInside:withEvent: on each view in the view hierarchy that returns YES, proceeding down the hierarchy until it finds the subview within whose bounds the touch took place. That view becomes the hit-test view.

( source )

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

让你的 ScrollView 成为第一响应者:

 [scrollView becomeFirstResponder]

将不起作用,因为这只会影响非触摸事件的调度。

您可以尝试让内部 View 不启用触摸,看看这是否会有所不同。

关于ios - 为什么滚动 UITableView 比滚动 UIScrollView 响应更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10549589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com