限制UIScrollView中的可滚动区域
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了限制UIScrollView中的可滚动区域相关的知识,希望对你有一定的参考价值。
我有一个UIScrollView滚动一个相当大的UIView。
在某些时候,我想限制用户可以滚动的区域。例如,我可能只想让他们查看视图的底部四分之一。
我可以通过覆盖scrollViewDidScroll来限制区域,然后在视图滚动太远的情况下调用setContentOffset。但是这样我就无法像UIScrollView那样顺利地反弹,当滚动超出UIView的范围时。
有没有更好的方法来限制UIScrollView中的可滚动区域?
我会将滚动视图的contentSize属性更改为您希望用户能够滚动的区域的大小,并调整子视图的frame.origin,使得您想要的左上边界出现在(0,0)相对于滚动视图。例如,如果您的视图高度为800点,并且您希望显示底部四分之一,请将contentSize的高度设置为200,并将view.frame.origin的y分量设置为-600。
我找到了适合我的东西。它让你滚动到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)执行相同的操作
另一种方法是覆盖UIScrollView
的方法:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
。
返回YES
将允许用户滚动。返回NO
不会。
注意:这将禁用对UIScrollView
内部嵌入pointInside
的任何视图的所有触摸。如果您不想滚动的区域没有任何交互,则非常有用。
此示例仅允许NO
在用户滚动UIScrollView
时滚动。 (在UITableView
内嵌有一个UITableView
和两个UIViews
)
UIScrollView
对Yoko在Swift 4中的回答有一点小改进
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
for (UIView *subview in self.subviews) {
if ([subview pointInside:[self convertPoint:point toView:subview] withEvent:event] && ![subview isKindOfClass:[UITableView class]]) {
return NO;
}
}
return YES;
}
这将使scrollview动画真正类似于它应该做的。当你处于“反弹”区域时,较慢的阻力将无法工作,并且动画持续时间必须取决于距离(不像这里一样),如果你想要精确的话。您也可以尝试在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()
}
}
中执行此逻辑并查看它的不同之处。关键是scrollViewDidScroll
必须使用动画:false,以便setContentOffset(_:,animated:)
的块可以捕获它并为其设置动画
以上是关于限制UIScrollView中的可滚动区域的主要内容,如果未能解决你的问题,请参考以下文章
为啥 View Controller 在 UIScrollView 上方滚动?