我有一个滚动视图。我希望它只在一个方向(垂直)滚动。有没有办法可以锁定水平滚动...??...
10 回答
为您提供相同(改编)的答案,如:
是的,这里的所有答案都可以...
但是如果由于某种奇怪的原因你的 contentSize 应该高于 UIScrollView
两个维度,你可以禁用实现UIScrollView
协议方法的水平滚动-(void)scrollViewDidScroll:(UIScrollView *)aScrollView
只需将其添加到您的UIViewController
float oldX; // here or better in .h interface
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
[aScrollView setContentOffset: CGPointMake(oldX, aScrollView.contentOffset.y)];
// or if you are sure you wanna it always on left:
// [aScrollView setContentOffset: CGPointMake(0, aScrollView.contentOffset.y)];
}
它只是用户滚动时调用的方法UIScrollView
,这样做会强制它的内容始终相同。x
self.scrollview.contentSize = CGSizeMake(1, self.scrollview.frame.size.height * number_of_items);
应该有帮助。我只是通过使用类似的技术水平锁定了我的滚动视图。
我发现约束滚动视图移动的最安全和最成功的方法是继承 UIScrollView并覆盖setContentOffset:animated:和setContentOffset:方法(代码如下)。
覆盖这些方法的优点是它在任何 UIKit 代码开始对其进行操作之前直接更改请求的contentOffset ,避免在scrollViewDidScroll:或其他UIScrollViewDelegate方法中修改 contentOffset 时可能发生的任何副作用。
创建新的子类只需要几分钟,它就像一个魅力。
- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated {
// restrict movement to vertical only
CGPoint newOffset = CGPointMake(0, contentOffset.y);
[super setContentOffset:newOffset animated:animated];
}
- (void)setContentOffset:(CGPoint)contentOffset {
// restrict movement to vertical only
CGPoint newOffset = CGPointMake(0, contentOffset.y);
[super setContentOffset:newOffset];
}
看到这个问题,你必须将可滚动大小设置为视图的相应大小,这样就没有什么可以滚动的了。
如果 UIScrollView 的contentSize
属性与 UIScrollView 的实际宽度相同,则无法进行水平滚动。
您想在水平滚动有效时停止水平滚动吗?(即contentSize
比实际的 UIScrollView 宽度更宽?)如果“是”,你为什么要这样做?
你可以试试这个
self.ScrollView.contentSize = CGSizeMake(self.ScrollView.frame.size.width, 1450);
这里 1450 是我的视野高度。
如果您将 contentSize 宽度设置为大于 scrollView 框架,则 scrollView 只能水平滚动。如果将 contentSize 宽度设置为与滚动视图相同,它将不会滚动。例如
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,100,100)]
[scrollView setContentSize:CGSizeMake(100, 300)]
哦,因为 iOS7 使用这个(在 initWithNibName 中):
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];
在我的情况下,contentSize 高于 x 和 y 的 UIScrollView。对我来说,meronixe 的回答效果很好,但对于我的需求来说还不够完整。不幸的是,水平滚动条仍然可见。
这我可以用下面的代码改变
- (void)webViewDidFinishLoad:(UIWebView *)webView
[self.webView.scrollView setShowsHorizontalScrollIndicator:NO];
迅速
禁用contentOffset.x = 0
水平滚动
extension ViewController: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.x = 0//to lock horizontal scrolling
//scrollView.contentOffset.y = 0//to lock vertical scrolling
}
}
此外,您可以禁用滚动指示器
scrollView.showsHorizontalScrollIndicator = false//to disable HorizontalScrollIndicator
scrollView.showsVerticalScrollIndicator = false//to disable VerticalScrollIndicator