UIScrollView 没有使用 setContentOffset:animated 滚动到正确的位置:

Posted

技术标签:

【中文标题】UIScrollView 没有使用 setContentOffset:animated 滚动到正确的位置:【英文标题】:UIScrollView not scrolling to proper location with setContentOffset:animated: 【发布时间】:2011-03-26 23:35:26 【问题描述】:

我在 UIScrollView 中有一系列图像。当用户释放滚动动作时,我希望视图以单个图像为中心。我已经实现了代码,但底层行为不正确。我对 setContentOffset:animated: 的调用具有正确的值,但视图实际上并没有滚动到该点。这是一些调试的输出:

2011-03-26 17:28:16.201 PivotMachine[39984:207] Dragging Beginning at: 270,   0
2011-03-26 17:28:16.322 PivotMachine[39984:207]     Dragging Ended at: 360,   0 --> 350,   0
2011-03-26 17:28:16.624 PivotMachine[39984:207]    Scrolling Ended at: 350,   0
2011-03-26 17:28:25.648 PivotMachine[39984:207] Dragging Beginning at: 447,   0

正如你所看到的,在内部,它认为它在 360 处停止拖动,因此正确地推进到 350,它应该在的位置。从视觉上看,它位于 450 左右,它知道我何时再次开始拖动(是的,我知道你不会立即开始,所以我拖动非常缓慢,只在事件前移动几个像素)。

这是拖动代码(对于我的 UIScrollView 子类):

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

    CGPoint myLocation = self.contentOffset;
    NSLog(@"Dragging Beginning at: %3.0f, %3.0f", myLocation.x, myLocation.y);


- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollV

    CGPoint myLocation = self.contentOffset;
    NSLog(@"   Scrolling Ended at: %3.0f, %3.0f", myLocation.x, myLocation.y);


- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

    // Auto-scroll to the center of the closest menu
    if (scrollView != self)
    
        DLog(@"[ScrollMenu scrollViewWillBeginDecelerating] called with non-self");
        return;
    
    CGPoint myLocation = self.contentOffset;
    int idx = [self indexOfMenuClosestTo:myLocation];
    CGPoint menuPoint = CGPointMake(menuPoints[idx], self.contentOffset.y);
    NSLog(@"    Dragging Ended at: %3.0f, %3.0f --> %3.0f, %3.0f",
         myLocation.x, myLocation.y, menuPoint.x, menuPoint.y);
    [self setContentOffset:menuPoint animated:YES];

我应该注意到这是在模拟器中。我还不能在实际的手机上试用它,因为我还没有把钱花在开发程序上(等到我的应用程序几乎准备好发布,以防我用尽了动力:)。

这可能是模拟器问题吗?有没有人见过类似的东西?哦,是的,我应该问:我做错了什么吗? ;)

跟进:我认为问题在于减速动画与我的-(void) setContentOffset:animated: 调用冲突。两个动画都继续运行,视图显示哪个获胜,但内部状态正确地基于setContentOffset。我以为setContentOffset 关闭了现有动画。有吗?如果没有,我该如何关闭它?

【问题讨论】:

我也有同样的问题,但是关闭 setContentOffset 上的动画并没有导致最终滚动位置在视觉上与 contentOffset 匹配。所以看起来这不是动画与动画的问题,而是可能在减速发生时设置 contentOffset? 【参考方案1】:

尝试使用- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated (docs) 而不是设置 contentOffset。 否则,我可以建议查看 UIScrollView 的 paging 属性,尽管它可能太受限而无法满足您的需求。

【讨论】:

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated 行为相同(有关更多详细信息,请参阅问题),不幸的是,如果不重组某些东西(我可能会决定尝试)。

以上是关于UIScrollView 没有使用 setContentOffset:animated 滚动到正确的位置:的主要内容,如果未能解决你的问题,请参考以下文章

Ueditor百度编辑器中的 setContent()方法的使用

升级到 Jetpack Compose Alpha 12 会导致 setContent 出现错误

UIScrollView:没有滚动

Ueditor1.3.6 setContent的一个bug

UIScrollView 没有使用 setContentOffset:animated 滚动到正确的位置:

没有 UIScrollView 的 iOS UIPageControl