【问题标题】:UIScrollView Not Scrolling?UIScrollView 不滚动?
【发布时间】:2013-11-15 06:39:13
【问题描述】:

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

【问题讨论】:

  • 发布初始化代码?
  • 这里没有初始化代码,相信是IB自动初始化了UIScrollView。我在代码方面所做的只是设置 scrollView 的 contentSize 属性
  • 覆盖并检查 UIScrollView 委托方法以检查 UIScrollView 是否实际上正在获取触摸事件或其他视图是否实际上正在占用所有事件.. 例如 scrollViewWillBeginDragging:
  • 我知道 UIScrollView 正在接收触摸事件,因为它会弹跳。我可以拉起内容,但它会弹回原来的位置。
  • 你能把代码贴出来吗?

标签: ios iphone objective-c cocoa-touch uiscrollview


【解决方案1】:
  1. viewDidLoad 即将推出。您必须等到视图布局完成后。尝试在 viewDidAppear 中设置 contentSize。

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

【讨论】:

  • 我尝试了第一个,但没有帮助。我查看了另一个答案,并编写了这个非常快速的代码来实现它:- (void)viewDidLoad { // Do any additional setup after loading the view. _mainScrollView.contentSize = CGSizeMake(4000, 4000); for(int i=0; i<_mainScrollView.subviews.count;i++){ UIView *newSubview=[_mainScrollView.subviews objectAtIndex:i]; newSubview.translatesAutoresizingMaskIntoConstraints=NO; } [super viewDidLoad]; }
  • @Nenad M:为什么忘记第一名?纯自动布局方法似乎仍然需要设置contentSize。也许如果你采用混合方法,你就不需要了,但我还没有尝试过。
  • @timquinn:秘密是什么?一个秘密似乎是this answer
【解决方案2】:

我知道如何在不编写代码的情况下克服这个问题的最佳方法是,这一切都可以在故事板中完成,方法如下:

  1. 启用自动布局。
  2. 使通用 UIView 成为 UIScrollView 的子视图。 2.1) 将所有 View 组件放在这个通用 UIView 中。
  3. 在子视图和 UIScrollView 之间建立一个自动布局约束。您必须将最后一个子视图的右侧和/或底部固定到 UIScrollView 的右侧和/或底部。这就是 UIScrollView 知道内容大小的方式。

【讨论】:

  • 非常感谢!这是我发现在 iOS 7 Landscape with Autolayout 中使用 UIScrollView 的唯一方法!!!!!!! :) 竖起大拇指!
【解决方案3】:

viewDidLoad 确实为时过早,但viewDidAppear:animated 也可能还不够晚。设置contentOffset 的理想位置是在viewDidLayoutSubviews 内部。

【讨论】:

    【解决方案4】:

    如果您使用的是自动布局,请确保将代码设置为在其中设置内容大小

    viewDidLayoutSubviews
    

    【讨论】:

      【解决方案5】:

      我在 UIScrollView 上使用了一个自定义视图,用于拉动刷新功能,并且滚动视图不可滚动。我尝试使用AutoLayout 设置contentSize,并尝试通过代码设置它。滚动视图仍然无法滚动。

      花了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)
      }
      

      参考文档:

      【讨论】:

        【解决方案6】:

        这是一个很好的滚动视图演练,以防有人在一段时间不使用后忘记了:https://medium.com/@pradeep_chauhan/how-to-configure-a-uiscrollview-with-auto-layout-in-interface-builder-218dcb4022d7

        基本上,确保您有视图 -> 滚动视图 -> 视图,如下所示:

        那么,
        1. 将滚动视图约束(顶部、底部、前导和尾随)设置为 (0,0,0,0)。
        2. 将内部视图约束(顶部、底部、前导和尾随)设置为 (0,0,0,0)。
        3.设置内视图与父视图等宽等高。
        4. 选择内视图的高度约束,设置优先级为低(250)。

        【讨论】:

          猜你喜欢
          • 2013-07-02
          • 1970-01-01
          • 1970-01-01
          • 2011-05-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多