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 出现错误