我有一个UIView
像iPhone的Springboard。我已经使用UIScrollView
和创建了它UIButtons
。我想在所说的scrollview上禁用水平滚动。我只想要垂直滚动。我该如何完成?
我有一个UIView
像iPhone的Springboard。我已经使用UIScrollView
和创建了它UIButtons
。我想在所说的scrollview上禁用水平滚动。我只想要垂直滚动。我该如何完成?
Answers:
您必须设置的contentSize
属性UIScrollView
。例如,如果您UIScrollView
的屏幕宽度为320像素(屏幕宽度),则可以执行以下操作:
CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];
然后,UIScrollView
它将仅垂直滚动,因为它已经可以水平显示所有内容。
更新:在@EranMarom指出他的评论之后)
您可以在“ 方法”中停止水平滚动或垂直滚动ScrollViewDelegate
。就是这样
停止水平滚动:
如果要水平滚动,则需要增加contentOffset.x。阻止滚动视图在水平方向上滚动。
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.x = 0.0
}
停止垂直滚动:
如果要垂直滚动,则需要增加contentOffset.y。防止此操作停止scrollview沿垂直方向滚动。
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.y = 0.0
}
上面的代码防止a 和中的更改,x
并导致停止滚动方法。y
scrollview contentOffset
scrollViewDidScroll:
scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);
禁用水平滚动。我发现它更具可读性,更小,并且没有必要进行零测试,因为很少有代码运行这种情况(例如,每秒最多几十次)几乎没有开销。
scrollView.contentOffset.y = 0.0
停止垂直滚动和scrollView.contentOffset.x = 0.0
停止水平滚动甚至更容易scrollViewDidScroll()
。但是,我相信确保scrollView.contentSize
均等scrollView.frame.size
是更好(正确)的解决方案。参见@danbeaulieu答案。
自iOS7使用以来
self.automaticallyAdjustsScrollViewInsets = NO;
//并创建包含3个页面的页面滚动器
self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)];
[self.pageView setShowsVerticalScrollIndicator:NO];
[self.pageView setPagingEnabled:YES];
[self.view addSubview:self.pageView];
self.collectionView.pagingEnabled = YES;
帮助我解决了平滑滚动(不拖动)的问题。问题出在方法上scrollViewWillEndDragging:
-targetContentOffset与scrollView.contentOffset相同,并且页面检测逻辑无法正常工作。
快速解决方案
创建两个出口,一个用于视图,一个用于滚动视图:
@IBOutlet weak var myView: UIView!
@IBOutlet weak var scrollView: UIScrollView!
然后,您可以在viewDidLayoutSubviews中添加以下代码:
let scrollSize = CGSize(width: myView.frame.size.width,
height: myView.frame.size.height)
scrollView.contentSize = scrollSize
我们所做的是收集视图的高度和宽度,并设置scrollViews内容大小以使其匹配。这将阻止滚动视图水平滚动。
更多想法:
CGSizeMake使用CGFloats来获取宽度和高度。您可能需要使用UIScrollViews的现有高度作为第二个参数。看起来像这样:
let scrollSize = CGSize(width: myView.frame.size.width,
height: scrollView.contentSize.height)
在我的情况下,contentView的宽度大于UIScrollView的宽度,这就是不必要的水平滚动的原因。我通过设置contentView的宽度等于UIScrollView的宽度来解决它。
希望对别人有帮助
iOS 11中引入的是的新属性 UIScrollView
var contentLayoutGuide: UILayoutGuide
该文档指出您:
当您要创建与滚动视图的内容区域相关的自动布局约束时,请使用此布局指南。
随着其它任何自动布局的限制,你可能会增加,你会想约束widthAnchor
的的UIScrollView
的contentLayoutGuide
是大小的‘帧’相同。您可以使用frameLayoutGuide
(也在iOS 11中引入)或任何外部宽度(例如superView
的)。
例:
NSLayoutConstraint.activate([
scrollView.contentLayoutGuide.widthAnchor.constraint(equalTo: self.widthAnchor)
])
文档:https : //developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide