2009-06-30 133 views
72

我有一个UIView像iPhone的跳板。我使用UIScrollViewUIButtons创建了它。我想在所述滚动视图上禁用水平滚动。我只想要垂直滚动。我如何做到这一点?如何禁用UIScrollView的水平滚动?

+5

你应该改变你的标题:你问的这个问题的水平和垂直的称号。人们后来在搜索引擎上找到你的问题,所以它仍然重要2年后:) – Julien 2011-06-18 22:15:16

+0

@RahulVyas上面的人有一个点。改变标题可以减少任何通过搜索引擎(例如我)来到这里的初学者的困惑)。 – SpacyRicochet 2011-09-12 09:23:50

+0

已经代表海报编辑了标题。 (虽然目前正在等待同行评议,编辑才会显现。) – 2011-09-28 12:02:00

回答

110

您必须设置UIScrollViewcontentSize财产。例如,如果你的UIScrollView是320个像素宽(在屏幕的宽度),那么你可以这样做:

CGSize scrollableSize = CGSizeMake(320, myScrollableHeight); 
[myScrollView setContentSize:scrollableSize]; 

UIScrollView将仅垂直滚动,因为它已经可以水平显示的一切。

+6

嗨。这个解决方案工作得很好!感谢那。我尝试将静态宽度设置为0.对于我来说,这也起作用。我不知道以后会不会有一些副作用。但如果不知道尺寸(即适用于iPhone和iPad的通用代码),这种方法效果非常好! – JackPearse 2011-04-28 10:32:48

+5

我认为CGSizeMake(0,myScrollableHeight)更好,所以即使并非所有的子视图都显示,水平滚动功能也是禁用的。 – LightNight 2013-08-29 16:11:05

+0

注意使用分页时将其中一个尺寸设置为0将导致VoiceOver将页码声明为“第1页的1”,而不管其值是否为 – josef 2014-01-10 01:09:34

77

更新:

(@EranMarom在他的评论中指出后),您可以停在ScrollViewDelegate方法水平滚动或垂直滚动​​。 这是怎么了,

停止水平滚动条:

如果你要水平滚动,那么你就需要增加contentOffset.x。防止停止scrollview水平滚动。

- (void)scrollViewDidScroll:(UIScrollView *)sender { 
    sender.contentOffset.x = 0.0 
} 

停止垂直滚动:

如果要垂直滚动,那么你就需要增加contentOffset.y。防止停止scrollview垂直方向的滚动。

- (void)scrollViewDidScroll:(UIScrollView *)sender { 
    sender.contentOffset.y = 0.0 
} 

上面的代码防止改变xscrollview contentOffsety,并导致停止滚动的scrollViewDidScroll:方法。

10

因为iOS7使用

self.automaticallyAdjustsScrollViewInsets = NO; 

//与

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]; 
0

一旦我做到了与一个UITableView只有1电池更换的UIScrollView 3页创建你页面滚动,它工作得很好。

0

我努力了一段时间尝试在这个和其他线程中的各种建议失败。

然而,在另一个线程(不知道在哪里),有人建议使用在UIScrollView的负面约束为他工作。

所以我尝试了不一致的结果约束的各种组合。最终对我的工作是将-32的前后约束添加到滚动视图中,并添加宽度为320(和居中)的(不可见)文本视图。

8

迅速解决

创建两个出口,一个是你的观点,一个用于滚动视图:

@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) 
4

您可以选择视图,然后在Attributes Inspector取消选中User Interaction Enabled

0

我有tableview中contentInset在viewDidLoad中设置(如下图),这是什么导致水平滚动

self.tableView.contentInset = UIEdgeInsetsMake(0, 30, 0, 0); 

检查是否有任何的tableview contentInset设置不同的原因,并禁用它

0

试试这个:

CGSize scrollSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, scrollHeight); 
[scrollView setContentSize: scrollSize]; 
0

使用这一行。

self.automaticallyAdjustsScrollViewInsets = NO;