如何在特定点停止 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: 使用touchesBegantouchesMovedtouchesEnded 创建您自己的滚动视图,并推断以使用适当的端点创建动力

【讨论】:

终于有人开始明白我在寻找什么了,哈哈。 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)animated

Apple 清楚地说明了这一点这个方法滚动内容视图,以便 rect 定义的区域在滚动视图内是可见的。如果该区域已经可见,则该方法不执行任何操作。

【讨论】:

【参考方案9】:

对于垂直滚动,我使用这个。完美运行

(void)scrollViewDidScroll:(UIScrollView *)scrollView self.scrollView.contentOffset = CGPointMake(0, desiredPoint.y);

【讨论】:

以上是关于如何在特定点停止 UIScrollView?的主要内容,如果未能解决你的问题,请参考以下文章

仅在特定值上停止 NSScrollView - 像 UIScrollView 分页

UIScrollView 跨设备 UI 兼容性

使用 scrollViewWillEndDragging 确保 UIScrollView 在定义的增量处停止

放大时,UIScrollview 调用 scrollViewDidEndDecelerating - 如何停止它?

如果我有新的 UI 更新,如何停止预定的 UI 更新?

如何从 UIScrollView 中删除 CAShapeLayer?