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

Posted

技术标签:

【中文标题】具有动态视图数量和自动布局 iOS6 的 UIScrollView【英文标题】:UIScrollView with dynamic number of views and Auto Layout iOS6 【发布时间】:2013-06-13 16:29:31 【问题描述】:

我在 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 不是视图字典中的键。 |[view1(宽度)][view2(宽度)][view3(宽度)]| ^'

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

感谢您的帮助!

克里斯

编辑:

还有一件事。 我读了this 文章,效果很好。但不幸的是,它不在一个动态数量的循环中。 :(

我阅读了来自苹果的this 文章。但我仍然找不到我的答案。

【问题讨论】:

你得到这个工作了吗,我有一个类似的问题,为动态数量的视图创建约束 【参考方案1】:

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

使用它的 FOR 循环。

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

【讨论】:

这里有更多细节。 CLICK HERE玩得开心!【参考方案2】:

NSDictionaryOfVariableBindings(视图)

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

传入视觉格式方法的视图字典必须为 VFL 字符串中使用的每个视图变量都有一个条目。

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

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

【讨论】:

以上是关于具有动态视图数量和自动布局 iOS6 的 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章

iOS6 CALayer释放/卸载滚动视图中滚动不可见的视图

具有自动布局的多个动态视图

UITableViewCell 具有嵌入式垂直堆栈视图设置,具有自动布局和动态高度

IOS6 使用自动布局的约束

如何在 iOS 6 中使用具有多个子视图的现有自定义视图自动布局

具有动态指定视图之间间距的自动布局