【问题标题】:UIScrollView not scrolling when adding item in IB and code在 IB 和代码中添加项目时 UIScrollView 不滚动
【发布时间】:2012-10-15 11:28:13
【问题描述】:

当我在我的场景上创建一个滚动视图,然后在 IB 中向场景添加一个按钮。然后我进入代码,设置内容大小,启用用户交互并添加另一个按钮。当我在模拟器中运行程序时,Scrollview 不起作用,如果我删除场景中 IB 中的按钮,它就可以正常工作。不能在 IB 中和以编程方式将项目添加到滚动视图吗?

编辑:我认为这可能是我已经拥有的应用程序中的某些内容。所以我决定创建一个新项目,其中只有代码和下面的场景图片。确实是在ScrollView下面添加的。

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[myButton setTitle:@"My Button" forState:UIControlStateNormal];
myButton.frame = CGRectMake(100, 100, 150, 50);
[scrollView addSubview:myButton];
scrollView.userInteractionEnabled = YES;
[scrollView setContentSize:CGSizeMake(320, 1000)];

【问题讨论】:

  • 是的,你可以同时添加两种方式.. 以编程方式添加的代码很好.. 确保在 xib 中,按钮添加到 scrollView 内,而不是在 scrollView 下方.. 如果可能的话,向我们展示 xib..
  • 你的滚动视图的框架是什么?
  • @vishy 更新问题。

标签: objective-c ios uiscrollview xcode4.5


【解决方案1】:

这里你的scrollView由于autoLayout而不滚动,如果你不使用,取消选中auto Layout。

我刚刚做了一个与您的要求类似的。它工作正常,在允许 autoLayout 后它就停止滚动了。

自动布局约束适合屏幕的可见部分,如果scrollView中的对象大于屏幕大小,它将滚动。

所以我的建议是,如果您不使用 autoLayout,只需取消选中它即可。

【讨论】:

  • 没有,甚至考虑自动布局。接得好。有什么办法可以解决这个问题,因为我在我的程序中使用了自动布局。我唯一能想到的是整个滚动视图需要以编程方式构建。
  • 如果你的 scrollView 内容高度固定为 1000,你可以设置约束值来支持它..
  • 我无法设置任何允许 Scrollview 使用自动布局的约束。您是否能够使用约束使其工作?
  • 不,还在尝试.. 如果您只想删除 scrollView 中的约束并尝试.. 对于其他人,您可以使用约束..
  • 我在 Apple 的网站上找到了这个。 developer.apple.com/library/ios/#releasenotes/General/… 它引用了 UIScrollView 问题,但我无法得到解决方案。
【解决方案2】:

这是一个有用的链接:http://developer.apple.com/library/ios/#releasenotes/General/RN-iOSSDK-6_0/_index.html#//apple_ref/doc/uid/TP40012166-CH1-SW19

基本上这就是说,使用自动布局,您不需要也不应该使用 setContentSize:。相反,您的内部视图应该将其边缘捕捉到滚动视图的边缘。让我演示一下我是如何解决它的。

scrollBackground : 包含需要在滚动视图中滚动的所有其他视图的视图。

[scrollview addSubview:scrollBackground];

[scrollview addConstraints:[NSLayoutConstraint 
       constraintsWithVisualFormat:@"V:|[scrollBackground(1000.0f)]|" 
       options:0 metrics:nil 
       views:NSDictionaryOfVariableBindings(scrollBackground)]];

[scrollview addConstraints:[NSLayoutConstraint 
       constraintsWithVisualFormat:@"H:|[scrollBackground(==scrollview)]|" 
       options:0 metrics:nil 
       views:NSDictionaryOfVariableBindings(scrollBackground)]];

这里的关键是那些 |在 VisualFormat 字符串的开头和结尾。这些将告诉滚动视图 contentSize 是什么。当然,如果您的 contentSize 小于滚动视图的框架大小,它就不会朝那个方向滚动。在我的示例中,宽度确实如此。它只能上下滚动。

【讨论】:

  • 出现错误:关于视图厚度的谓词必须以 ')' 结尾,并且视图必须以 ']' 结尾
【解决方案3】:

确保在 viewDidLoad 中或在视图已经从 nib 文件加载后的某个时间设置内容大小。

正如 vishy 指出的那样,您的 Button 应该是 ScrollView 层次结构的一部分,否则您将只是滚动一个空视图。

【讨论】:

    【解决方案4】:

    在您发布的情况下,滚动视图不会滚动,因为所有内容都是可见的。尝试将最后一行更改为:

    [scrollView setContentSize:CGSizeMake(50, 50)];
    

    它会开始滚动,因为内容大小小于视图中的所有内容。

    【讨论】:

      【解决方案5】:

      this question 中查看 d2burke 的答案 你应该把你的代码放在viewWillLayoutSubviews而不是viewDidAppear

      【讨论】:

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