【发布时间】:2011-07-03 00:22:24
【问题描述】:
IB 中有一个选项可以取消选中滚动视图上的垂直滚动,但它似乎不起作用。
如何在代码而不是IB中将scrollview设置为只水平滚动,而不是垂直滚动?
【问题讨论】:
标签: iphone ios uiscrollview
IB 中有一个选项可以取消选中滚动视图上的垂直滚动,但它似乎不起作用。
如何在代码而不是IB中将scrollview设置为只水平滚动,而不是垂直滚动?
【问题讨论】:
标签: iphone ios uiscrollview
尝试将 contentSize 的高度设置为 scrollView 的高度。那么垂直滚动应该被禁用,因为没有什么可以垂直滚动。
scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,scrollView.frame.size.height);
【讨论】:
是的,pt2ph8的回答是对的,
但是如果由于某种奇怪的原因你的 contentSize 应该高于 UIScrollView,你可以禁用实现 UIScrollView 协议方法的垂直滚动
-(void)scrollViewDidScroll:(UIScrollView *)aScrollView;
只需将其添加到您的 UIViewController 中
float oldY; // here or better in .h interface
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
[aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, oldY)];
// or if you are sure you wanna it always on top:
// [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, 0)];
}
这只是用户滚动 UIScrollView 时调用的方法,这样做会强制它的内容始终具有相同的 .y
【讨论】:
float oldY; 参考上面的代码。这是每个应用程序的 C 风格变量符号,该变量必须声明为控制器类的实例成员。
我更新了内容大小以禁用垂直滚动,并且仍然可以滚动。然后我发现我也需要禁用垂直反弹,以完全禁用滚动。
也许有人也有这个问题。
【讨论】:
从 iOS7 开始:
首先:内容大小宽度必须等于你的滚动视图的宽度
第二个:在你的 initWithNibName 中:
self.automaticallyAdjustsScrollViewInsets = NO;
就是这样。
【讨论】:
包括以下方法
-(void)viewDidLayoutSubviews{
self.automaticallyAdjustsScrollViewInsets = NO;
}
并将滚动视图的内容大小宽度设置为等于滚动视图的宽度。
【讨论】:
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
[aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x,0)];
}
你必须已经确认UIScrollViewDelegate
aScrollView.delegate = self;
【讨论】:
只需将 y 设置为始终位于顶部即可。 需要符合 UIScrollViewDelegate
func scrollViewDidScroll(scrollView: UIScrollView) {
scrollView.contentOffset.y = 0.0
}
这将保持滚动的减速/加速效果。
【讨论】:
您需要在内容大小中传递 0 以禁用您想要的方向。
禁用垂直滚动
scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,0);
禁用水平滚动
scrollView.contentSize = CGSizeMake(0,scrollView.contentSize.height);
【讨论】:
在 iOS 11 上,如果您有兴趣创建一个粘在屏幕边界而不是安全区域的滚动视图,请记得添加以下内容。:
if (@available(iOS 11.0, *)) {
[self.scrollView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}
【讨论】:
从 iOS11 可以使用以下属性
let frameLayoutGuide: UILayoutGuide
如果您将 frameLayoutGuide.topAnchor 和 frameLayoutGuide.bottomAnchor 的约束设置为 scrollViewsubview 的相同锚点/em> 然后垂直滚动将被禁用,scrollView 的高度将等于其子视图的高度。
【讨论】:
最明显的解决方案是禁止在子类中更改 y 坐标。
override var contentOffset: CGPoint {
get {
return super.contentOffset
}
set {
super.contentOffset = CGPoint(x: newValue.x, y: 0)
}
}
这是在以下情况下唯一合适的解决方案:
【讨论】:
很多答案包括将contentOffset 设置为0。我有一个案例,我希望scrollView 内的视图居中。这为我完成了工作:
public func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.y = -scrollView.contentInset.top
}
【讨论】:
我觉得可以
应该可以的。
【讨论】: