在IB和代码中添加项目时,UIScrollView不滚动

时间:2012-10-15 11:28:13

标签: objective-c ios uiscrollview xcode4.5

当我在场景中创建Scrollview,然后在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)];

enter image description here

5 个答案:

答案 0 :(得分:4)

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

我刚刚提出了类似的要求。它运行正常,在允许autoLayout之后它就停止了滚动。

自动布局约束适合屏幕的可见部分,如果scrollView中的对象超出屏幕大小,则会滚动。

所以我的建议如果你没有使用autoLayout只是取消选中它,并且工作正常。

答案 1 :(得分:4)

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

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

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

[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字符串的开头和结尾。这些将告诉scrollview什么是contentSize。当然,如果您的contentSize小于scrollview的帧大小,它将不会在该方向上滚动。在我的例子中,这对宽度来说是正确的。它只上下滚动。

答案 2 :(得分:1)

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

当vishy指出时,你的Button应该是ScrollView的Hierarchy的一部分,否则你只是滚动一个空视图。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

检查this question中的d2burke答案  您应该将代码放在viewWillLayoutSubviews而不是viewDidAppear