【发布时间】:2011-07-19 05:33:11
【问题描述】:
我一直无法找到答案(也许有人一起破解了解决方案)。
是否可以在 UIScrollView 中禁用单向滚动?我不是在谈论禁用垂直或水平滚动,而是仅在一个方向上。因此,例如,在 UIScrollView 中,我希望能够向下拖动滚动视图,但不能向上拖动
谢谢
【问题讨论】:
标签: uiscrollview
我一直无法找到答案(也许有人一起破解了解决方案)。
是否可以在 UIScrollView 中禁用单向滚动?我不是在谈论禁用垂直或水平滚动,而是仅在一个方向上。因此,例如,在 UIScrollView 中,我希望能够向下拖动滚动视图,但不能向上拖动
谢谢
【问题讨论】:
标签: uiscrollview
事实证明,一个简单的解决方案实际上是可行且容易的:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.contentOffset.y > 60) {
[scrollView setContentOffset:CGPointMake(0, 60)];
}
}
【讨论】:
另一种可能是:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.contentOffset.y < 10) {
scrollView.bounces = NO;
}
else scrollView.bounces = YES;
}
但请记住,这仅适用于滚动视图,它们的内容比它们的框架更大。
【讨论】:
这对我有用:
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
scrollView.bounces = YES;
}
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
if (scrollView.contentOffset.y < 0) {
[scrollView setContentOffset:CGPointMake(0, 0)];
scrollView.bounces = NO;
}
if (scrollView.contentOffset.y == 0){
scrollView.bounces = YES;
}
else scrollView.bounces = YES;
}
【讨论】:
幸运的是,我们可以使用 scrollRectToVisible 来避免滚动受限后的抖动行为:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.contentOffset.y > 60) {
[scrollView setContentOffset:CGPointMake(0, 60)];
CGFloat pageWidth = scrollView.frame.size.width;
CGFloat pageHeight = scrollView.frame.size.height;
CGRect rect = CGRectMake(0, 0, pageWidth, pageHeight);
[scrollView scrollRectToVisible:rect animated:YES];
}
}
【讨论】:
如果用户不小心垂直滚动,上述解决方案会将您重置为零。试试这个...
- (void)scrollViewDidScroll:(UIScrollView *) scrollView {
if (scrollView.contentOffset.y > 0) {
[scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x, 0)];
}
}
【讨论】:
如果你设置滚动条的contentSize等于内容的大小,在其中一个方向上,滚动条会在那个方向上消失,因为没有东西可以滚动。
【讨论】:
与其使用 UIScrollViewDelegate 来纠正已经错误的 contentOffset(这将导致抖动行为),不如考虑改为子类 UIScrollView 并覆盖 setContentOffset:
- (void)setContentOffset:(CGPoint)contentOffset {
if (contentOffset.y <= 60) {
[super setContentOffset:contentOffset];
}
}
当然,这可以通过为内容偏移量的最小或最大允许值添加一个属性来概括。您可能还需要覆盖 setContentOffset:animated:。
【讨论】:
这对我有用
static CGPoint lastOffset;
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
scrollView.scrollEnabled = YES;
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
scrollView.scrollEnabled = YES;
lastOffset = scrollView.contentOffset;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGPoint nowOffset = scrollView.contentOffset;
NSLog(@"delta %f", lastOffset.x - nowOffset.x);
if ((lastOffset.x - nowOffset.x) < 0) {
//uncomment to prevent scroll to left
//scrollView.scrollEnabled = NO;
} else if ((lastOffset.x - nowOffset.x) > 0) {
//uncomment to prevent scroll to right
//scrollView.scrollEnabled = NO;
} else {
scrollView.scrollEnabled = YES;
}
}
【讨论】:
可以通过将 scrollView.contentSize 高度设置为与 scrollView.frame.size.height 相同的值来移除垂直方向的滚动。任何溢出的内容都将被隐藏。当然也可以这样做来限制垂直滚动。
【讨论】:
关闭自动布局。在内容视图中禁用自动布局后,我才解决了同样的问题。 Xcode 11。自动 -> 将掩码转换为约束
【讨论】: