UIScrollView具有动态视图数和iOS6自动布局

时间:2013-06-13 16:29:32

标签: objective-c ios6 uiview uiscrollview nslayoutconstraint

我正在使用自动布局在iOS6中使用UIScrollView。 我想要做的是设置一个包含许多子视图(UIViews)的滚动视图。这些子视图是在循环中动态创建的。现在我想添加我的约束,以便它正在使用自动布局。

在viewDidLoad中我得到了这段代码:

scrollView.pagingEnabled = YES;
CGRect selfBounds = self.view.bounds;
CGFloat width = CGRectGetWidth(self.view.bounds);
CGFloat height = CGRectGetHeight(self.view.bounds);
NSMutableString *constraintBuilding = [NSMutableString stringWithFormat:@"|"];

NSArray *colors = [NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor], [UIColor blueColor], nil];
for (int i = 0; i < colors.count; i++) {
    CGFloat offset = width * i;
    UIView* view1 = [[UIView alloc] initWithFrame:CGRectOffset(selfBounds, offset, 0)];
    [view1 setTranslatesAutoresizingMaskIntoConstraints:NO];
    [view1 setBackgroundColor:[colors objectAtIndex:i]];
    [scrollView addSubview:view1];
    [scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view1(height)]|" options:0 metrics:@{@"height":@(height)} views:NSDictionaryOfVariableBindings(view1)]];
    [constraintBuilding appendString:[NSString stringWithFormat:@"[view%i(width)]",i+1]];
}

NSMutableArray *views = [[NSMutableArray alloc] init];

for (int j = 0; j < scrollView.subviews.count; j++) {
    if (![[scrollView.subviews objectAtIndex:j] isKindOfClass:[UIImageView class]]) {
        [views addObject:[scrollView.subviews objectAtIndex:j]];
    }
}


[constraintBuilding appendString:@"|"];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:constraintBuilding options:0 metrics:@{@"width":@(width*colors.count)} views:NSDictionaryOfVariableBindings(views)]];

循环工作正常,但我会在最后一行收到错误

[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:constraintBuilding options:0 metrics:@{@"width":@(width*colors.count)} views:NSDictionaryOfVariableBindings(views)]];

constraintBuilding说“| [view1(width)] [view2(width)] [view3(width)] |” 其实我没有view2和view 3,但我不知道如何设置约束?!

这是个例外:

'NSInvalidArgumentException', reason: 'Unable to parse constraint format: 

view1不是视图字典中的键。 | [厂景(宽度)] [视图2(宽度)] [VIEW3(宽度)] |        ^'

为了测试我的颜色数组中有3个对象,但稍后这个数字会动态变化。

感谢您的帮助!

克里斯

修改

还有一件事。 我看过this文章,它运作得很好。但不幸的是,它不是一个有动态数量的视图的循环。 :(

我阅读了苹果的this文章。但我还是找不到答案。

2 个答案:

答案 0 :(得分:2)

我认为你有结果。 只是测试和流动。

使用FOR循环。

http://www.apeth.com/iOSBook/ch20.html

答案 1 :(得分:1)

  

NSDictionaryOfVariableBindings(视图)

在这一行views是一个数组。这将创建一个包含单个条目的字典,其中键为views作为数组的对象。

传递给可视格式方法的视图字典必须具有VFL字符串中使用的每个视图变量的条目。

不是构建一个可变的视图数组,而是构建一个可变字典,在每个循环中添加创建垂直约束时创建的单视图字典。

然后,您可以在最终的可视格式方法中使用此完整的字典。