我有一个UIView
像 iPhone 的跳板。我使用UIScrollView
and创建了它UIButtons
。我想在所述滚动视图上禁用水平滚动。我只想要垂直滚动。我该如何做到这一点?
15 回答
您必须设置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。防止在垂直方向停止滚动视图滚动。
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.y = 0.0
}
上面的代码阻止了a和 a的变化,x
并导致停止滚动方法。y
scrollview contentOffset
scrollViewDidScroll:
从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];
迅捷解决方案
创建两个出口,一个用于您的视图,一个用于您的滚动视图:
@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
我们所做的是收集视图的高度和宽度,并设置滚动视图的内容大小以匹配它。这将阻止您的滚动视图水平滚动。
更多想法:
CGSizeMake 使用 CGFloats 获取宽度和高度。您可能需要使用 UIScrollViews 现有高度作为第二个参数。看起来像这样:
let scrollSize = CGSize(width: myView.frame.size.width,
height: scrollView.contentSize.height)
就我而言,使用Swift 4.2,您可以使用:
禁用垂直滚动:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.y = 0.0
}
禁用水平滚动:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.x = 0.0
}
在我的情况下, contentView 的宽度大于 UIScrollView 的宽度,这就是不需要的水平滚动的原因。我通过将 contentView 的宽度设置为 UIScrollView 的宽度来解决它。
希望它可以帮助某人
您可以选择视图,然后在Attributes Inspector
取消选中User Interaction Enabled
。
iOS 11 中引入了一个新属性UIScrollView
var contentLayoutGuide: UILayoutGuide
该文档指出,您:
当您想要创建与滚动视图的内容区域相关的自动布局约束时,请使用此布局指南。
除了您可能添加的任何其他 Autolayout 约束外,您还需要将widthAnchor
' UIScrollView
s约束contentLayoutGuide
为与“框架”相同的大小。您可以使用frameLayoutGuide
(也在 iOS 11 中引入)或任何外部宽度(例如您superView
的 's.)
例子:
NSLayoutConstraint.activate([
scrollView.contentLayoutGuide.widthAnchor.constraint(equalTo: self.widthAnchor)
])
文档: https ://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide
我为此苦苦挣扎了一段时间,尝试了此线程和其他线程中的各种建议,但均未成功。
但是,在另一个线程中(不确定在哪里),有人建议对 UIScrollView 使用负约束对他有用。
所以我尝试了各种结果不一致的约束组合。最终对我有用的是在滚动视图中添加 -32 的前导和尾随约束,并添加一个宽度为 320(并居中)的(不可见)文本视图。
我在 viewDidLoad 中设置了 tableview contentInset(如下所示),这是导致水平滚动的原因
self.tableView.contentInset = UIEdgeInsetsMake(0, 30, 0, 0);
检查是否有任何因不同原因设置的 tableview contentInset 并禁用它
试试这个:
CGSize scrollSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, scrollHeight);
[scrollView setContentSize: scrollSize];
通过覆盖contentOffset
子类中的属性来禁用水平滚动。
override var contentOffset: CGPoint {
get {
return super.contentOffset
}
set {
super.contentOffset = CGPoint(x: 0, y: newValue.y)
}
}
一旦我用只有 1 个单元格的 UITableView 替换 UIScrollView,它就可以正常工作了。
使用这一行。
self.automaticallyAdjustsScrollViewInsets = NO;