2

当我在我的场景上创建一个滚动视图,然后在 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)];

在此处输入图像描述

4

5 回答 5

4

这是一个有用的链接: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 小于滚动视图的框架大小,它就不会朝那个方向滚动。在我的示例中,宽度确实如此。它只能上下滚动。

于 2012-10-23T15:39:20.037 回答
4

由于自动布局,您的滚动视图不会滚动,如果您不使用,请取消选中自动布局。

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

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

因此,如果您不使用 autoLayout,我的建议只是取消选中它,并且工作正常。

于 2012-10-15T12:12:44.870 回答
1

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

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

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

于 2012-10-15T12:06:26.480 回答
1

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

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

于 2012-10-15T11:34:24.533 回答
0

检查这个问题中的 d2burke 答案, 您应该将代码放入viewWillLayoutSubviews而不是viewDidAppear

于 2013-01-16T08:23:46.693 回答