对UIScrollView contentOffset的更改在减速时不会粘滞

时间:2010-07-13 17:17:41

标签: iphone ipad scroll uiscrollview

我看过UIScrollView. Any thoughts on implementing "infinite" scroll/zoom?,但它并没有完全解决我的问题。不过我很困惑,因为我猜其他人没有看到我的问题,所以也许它与我的代码的细节有关。 Allisone提供的示例代码与我的类似,不过我使用scrollViewDidScroll监视contentOffset而不是自定义KVO方法。

当我的UIScrollView正在减速时,如果我在UIScrollView的边界左侧插入一个子视图并将contentOffset增加我插入的子视图的宽度,则忽略对contentOffset的更改;内容“跳转”插入的子视图的宽度,并且contentOffset值流在其后续的scrollViewDidScroll调用中继续其当前轨迹。只需跟踪,就没有问题。有什么我可能做错了吗?就减速事件而言,几乎就像bounds或contentOffset是粘性的一样。

使用案例:UIScrollView具有非常大的虚拟内容,可以动态分页输入和输出,当用户顺利滚动UIScrollView中的内容时(向左),应该在最左边插入其他内容在不中断当前正在进行的平滑滚动的情况下滚动视图。正如我所说,如果禁用减速或我依靠拖动而不是轻弹,这样可以正常工作。

首先,我希望问题是由于将标题中的UIScrollView内容更改为scrollViewDidScroll引起的,所以我通过执行延迟的performSelector进行了双重检查,但问题仍然存在。

谢谢, 凯文

2 个答案:

答案 0 :(得分:1)

尽管不完全是你的想法,但使用setContentOffset:animated将具有所需的结果(将内容偏移改为右坐标),尽管它将被动画化。

答案 1 :(得分:1)

面对同样的问题。好像很奇怪的UIScrollView错误。我在Apple的StreetScroller示例的基础上修复了它。 InfiniteScrollView继承自UIScrollView,在那里运行良好。但是如果你想创建自己内部使用UIScrollView的自定义类,你可以继承这个UIScrollView并在需要重新定位这样的内容时调用delegate:

tScrollView : UIScrollView

In tScrollView.m:

- (void)recenterIfNecessary {
    if (_tDelegate && [_tDelegate respondsToSelector:@selector(offsetForRecenterScrollView:)])
        self.contentOffset = [_tDelegate offsetForRecenterScrollView:self];
}
- (void)layoutSubviews {
    [super layoutSubviews];
    [self recenterIfNecessary];
}

在委托中实施offsetForRecenterScrollView:并返回要在scrollView.contentOffset中设置的新CGPoint。