我有一个滚动相当大的UIView的UIScrollView。
在某些时候,我想限制用户可以滚动的区域。例如,我可能只想让他们查看视图的底部四分之一。
我可以通过覆盖scrollViewDidScroll来限制区域,然后在视图滚动太远的情况下调用setContentOffset。但是这样我就无法像UIScrollView那样顺利地反弹,当滚动超出UIView的界限时可以自然地做到。
是否有更好的方法来限制UIScrollView中的可滚动区域?
答案 0 :(得分:17)
我会将滚动视图的contentSize属性更改为您希望用户能够滚动的区域的大小,并调整子视图的frame.origin,使您想要的左上边界出现在(0 ,0)相对于滚动视图。例如,如果您的视图高度为800点,并且您想显示底部四分之一,请将contentSize的高度设置为200,并将view.frame.origin的y分量设置为-600。
答案 1 :(得分:5)
我找到了对我有用的东西。它让你滚动到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)执行相同操作
答案 2 :(得分:0)
另一种方法是覆盖UIScrollView
的方法:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
。
返回YES
将允许用户滚动。返回NO
不会。
注意:这将禁用UIScrollView
返回pointInside
的{{1}}内嵌入的任何视图的所有触摸。如果您不想滚动的区域没有任何互动,则非常有用。
此示例仅允许NO
在用户滚动UIScrollView
时滚动。 (UITableView
)内嵌{UITableView
和UIViews
{/ p>}
UIScrollView
答案 3 :(得分:0)
Yoko在Swift 4中的答案有一个小改进
override func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
if scrollView.contentOffset.y > 600 {
let anim = UIViewPropertyAnimator(duration: 1, dampingRatio: 0.5) {
scrollView.isScrollEnabled = false
scrollView.setContentOffset(CGPoint(x: 0, y: 600), animated: false)
scrollView.isScrollEnabled = true
}
anim.startAnimation()
}
}
这将使scrollview的动画效果与应做的动画非常相似。当您位于“弹跳”区域时,较慢的拖动将不起作用,并且如果要精确的话,动画持续时间必须取决于距离(此处不是常数)。您也可以尝试在scrollViewDidScroll
中执行此逻辑,并查看其差异。关键是setContentOffset(_:,animated:)
必须具有 animated:false ,以便UIViewPropertyAnimator
的图块可以捕获它并对其进行动画处理