如何在特定点停止 UIScrollView?
Posted
技术标签:
【中文标题】如何在特定点停止 UIScrollView?【英文标题】:How to stop a UIScrollView at a specific point? 【发布时间】:2012-01-25 12:51:16 【问题描述】:如何在特定点停止UIScrollView
?即设置UIScrollView
在用户交互后的最终位置?
具体来说,您如何设置沿水平UIScrollView
的间隔,以便它只会停在这些点上?
我希望我所说的足够清楚。
【问题讨论】:
请注意,“非常简单”的方法是,只需让滚动视图与每个“单元”一样宽 - 并设置分页。你完成了。请注意,将“滚动视图的其余部分”“悬挂在”“实际”滚动视图的两侧是可以的。如有必要,您必须小心操作可触摸区域。 @JoeBlow 可以解决一些我确定的问题,但它没有回答问题。我希望能够将滚动位置设置为 any 特定点...分页不是这里的答案。 嘿,杰西 - 无论如何。我只是指出了实现这一目标的“超级简单”方法,通常您可以使用! 【参考方案1】:看看UIScrollViewDelegate
的方法scrollViewWillEndDragging:withVelocity:targetContentOffset:
。它旨在满足您的需求。
当用户完成拖动滚动视图时,滚动视图会将此消息发送给它的委托。第三个参数(targetContentOffset
)作为指针传递,你可以改变它的值来改变滚动视图的停止位置。
ios 5.0 及更高版本。
【讨论】:
@JesseHead 那么你的最终答案是什么? 请注意,在许多情况下,您还将使用scrollViewDidScroll
- 这样,值会随着用户按住并移动滑块而改变。
对于像我这样的其他 n00bs,您可以通过将 targetContentOffset.pointee
更新为新的 CGPoint
值来更改 targetContentOffset
;)【参考方案2】:
您有 3 个选项:
-
您可以使用
pagingEnabled
来执行此操作。
在UIScrollViewDelegate
scrollViewDidEndDecelerating:
方法中使用setContentOffset: animated:
使用touchesBegan
、touchesMoved
和touchesEnded
创建您自己的滚动视图,并推断以使用适当的端点创建动力
【讨论】:
终于有人开始明白我在寻找什么了,哈哈。 2号看起来很吸引人。看看它是如何工作的。 您知道在触发 scrollViewDidEndDecelerating: 方法时如何检测滚动视图的当前位置吗? 当前位置存储在contentOffset
(CGPoint)属性中
@JesseHead 你最后用了什么?【参考方案3】:
我找到了适合我的东西。它让您滚动到点 0,0,但不能再进一步:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
if (scrollView.contentOffset.x <= -1)
[scrollView setScrollEnabled:NO];
[self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
[scrollView setScrollEnabled:YES];
您可以对顶部、底部或右侧(x 或 y)执行相同操作
【讨论】:
帮了我很多忙!【参考方案4】:要实现这一点,您需要启用滚动视图的分页
例如:
[scrollView setContentSize:CGSizeMake(640, 161)];
[scrollView setPagingEnabled:YES];
这里,滚动视图的宽度是 640(iphone 屏幕宽度的两倍),如果启用分页,它将根据宽度平均划分。所以当我们滚动到这个位置时,它会停在特定的偏移量处。
【讨论】:
是的......我最初看过那个,但我想让我的内容在滑动后停在任意数量的位置。分页只允许每次滑动移动一组距离(在这种情况下,我相信是 320 像素?)。这很难解释...如果您查看名为“pulse”的免费新闻应用程序,它会显示我所追求的。 实际上如果scrollview的内容大小大于屏幕大小,用户可以设置为滚动水平/垂直的固定位置...你想通过代码来做到这一点吗..? 你可以通过实现它的委托方法来做到这一点,并且使用它的偏移值你可以滚动更多或停止滚动...... 使用 - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated 按代码滚动到固定位置(偏移量),计算所需的确切偏移量.. 啊,是的,但是触发上述方法是否必须发生单独的事件?我希望它在滚动结束后自动发生。【参考方案5】:对于那些我们需要在 Swift 中设置 targetContentOffset
的人,就像 rob mayoff 在他上面的出色回答中所说的那样:
func scrollViewWillEndDragging(scrollView: UIScrollView!, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)
targetContentOffset.memory.y = x
【讨论】:
【参考方案6】:这会很好用:
override func scrollViewDidScroll(scrollView: UIScrollView)
if scrollView.contentOffset.y > CERTAIN_POINT
scrollView.scrollEnabled = false
scrollView.scrollEnabled = true
【讨论】:
【参考方案7】:[scrollView setContentSize:CGSizeMake(640, 161)];
【讨论】:
【参考方案8】:我认为这可以帮助您检查苹果提供的这个 API
(void)scrollRectToVisible:(CGRect)rect 动画:(BOOL)animatedApple 清楚地说明了这一点这个方法滚动内容视图,以便 rect 定义的区域在滚动视图内是可见的。如果该区域已经可见,则该方法不执行任何操作。
【讨论】:
【参考方案9】:对于垂直滚动,我使用这个。完美运行
(void)scrollViewDidScroll:(UIScrollView *)scrollView self.scrollView.contentOffset = CGPointMake(0, desiredPoint.y);【讨论】:
以上是关于如何在特定点停止 UIScrollView?的主要内容,如果未能解决你的问题,请参考以下文章
仅在特定值上停止 NSScrollView - 像 UIScrollView 分页
使用 scrollViewWillEndDragging 确保 UIScrollView 在定义的增量处停止