当我在场景中创建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)];
答案 0 :(得分:4)
由于autoLayout,您的scrollView不会滚动,如果您不使用,请取消选中自动布局。
我刚刚提出了类似的要求。它运行正常,在允许autoLayout之后它就停止了滚动。
自动布局约束适合屏幕的可见部分,如果scrollView中的对象超出屏幕大小,则会滚动。
所以我的建议如果你没有使用autoLayout只是取消选中它,并且工作正常。
答案 1 :(得分:4)
基本上这就是说,使用自动布局你不需要也不应该使用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