2013-11-04 92 views
11

我有一个UIScrollView在界面生成器中创建了一堆UITextViewUIImageView对象已经添加。我已将它连接到IBOutlet,并在-(void)viewDidLoad下将其内容大小设置为1200x2000。用户交互已启用,多点触控,滚动已启用并显示垂直和水平滚动指示都设置为YES。当我在iOS模拟器中启动应用程序时,它不会滚动。什么可能是这种行为的原因?UIScrollView不滚动?

+0

发布的初始化代码? –

+0

没有任何初始化代码,我相信UIScrollView是由IB自动初始化的。我所做的代码明智的做法是设置scrollView的contentSize属性 – 68cherries

+0

重写并检查UIScrollView委托方法,以检查UIScrollView实际上是否获取触摸事件或某个其他视图实际上是吃掉所有事件..g scrollViewWillBeginDragging: – Dinesh

回答

19
  1. viewDidLoad即将推出。您必须等到视图布局发生之后。尝试在viewDidAppear中设置contentSize。

  2. 您使用的是自动布局?如果是这样,请查看以下答案(并忘记1.): UIScrollView doesn't use autolayout constraints

+0

我尝试了第一个,但没有帮助。我检查了另一个答案,并写了这个非常快速的代码来实现它:' - (void)viewDidLoad { //在加载视图后执行任何其他设置。 _mainScrollView.contentSize = CGSizeMake(4000,4000);对于(int i = 0; i <_mainScrollView.subviews.count; i ++){ UIView * newSubview = [_ mainScrollView.subviews objectAtIndex:i]; newSubview.translatesAutoresizingMaskIntoConstraints = NO; } [super viewDidLoad]; }' – 68cherries

+0

@Nenad M:为什么忘记第一?纯自动布局方法似乎仍然需要设置'contentSize'。也许如果你采取混合的方式,你不需要这样做,但我还没有尝试过。 – testing

+0

@timquinn:什么是秘密?一个秘密似乎是[这个答案](http://stackoverflow.com/a/16029013/426227)。 – testing

8

我知道如何解决这个问题,而不是诉诸编写代码的最佳方式是,这一切都可以在故事板内完成,这里是如何:启用

  1. 离开自动布局。
  2. 制作一个通用的UIView UIScrollView的子视图。 2.1)把所有的视图组件放在这个通用的UIView中。
  3. 在子视图和UIScrollView之间进行自动布局约束。您必须将最后一个子视图的右侧和/或底部固定在UIScrollView的右侧和/或底部。这就是UIScrollView知道内容大小的方式。
+0

非常感谢你!这是我发现在iOS 7环境中使用UIScrollView与Autolayout一起工作的唯一方法!!!!!!! :) 竖起大拇指! –

4

viewDidLoad确实为时过早,但viewDidAppear:animated也许不够迟。设置contentOffset的理想场所在viewDidLayoutSubviews之内。

3

如果您使用自动布局,确保你把代码中

viewDidLayoutSubviews 
0

我使用自定义视图的UIScrollView的设置内容大小,拉刷新功能,滚动视图不滚动。我尝试设置contentSizeAutoLayout,并尝试通过代码设置它。滚动视图仍然无法滚动。

花费3〜4小时后,我通过contentInset来解决。它会告诉滚动视图为滚动添加一些额外的空间。

override func viewDidLayoutSubviews() { 
    // Add extra 15pt on the `top` of scrollView. 
    //self.scrollView.contentInset = UIEdgeInsetsMake(15, 0, 0, 0) 

    // Add extra 2pt on the `bottom` of scrollView, let it be scrollable. And the UI is more beautiful in my case. 
    self.scrollView.contentInset = UIEdgeInsetsMake(0, 0, 2, 0) 
} 

参考文档: