使用autolayout创建Objective-C动态视图

时间:2014-06-25 01:50:20

标签: ios objective-c dynamic uiview autolayout

一直在搜索,无法找到任何解决方案。

我有一个视图,它将在初始化参数中包含一定数量的子视图。

我想以编程方式使用autolayout布局这些子视图。

通常情况下,我会使用:

NSDictionary *views = NSDictionaryOfVariableBindings(_view1, _view2);

但是这需要我的视图为每个视图保留一个属性,并且我不知道在运行时需要多少...

没有运气,我的目标是这样:

for(int i = 0; i < [self.rows intValue]; i++) {
        for(int j = 0; j < [self.steps intValue]; j++) {
            LED *led = [[LED alloc] init];
            [self.leds addEntriesFromDictionary:@{[NSString stringWithFormat:@"led%d_%d", i, j]:led}];
        }
    }
    for(LED *led in self.leds) {
        [self addSubview:led];
    }
    for(int i = 0; i < [self.rows intValue]; i++) {
        for(int j = 0; j < [self.steps intValue]; j++) {
            NSString *horizontalConstraint = [NSString stringWithFormat:@"|-%d-[led%d_%d]", (LED_WIDTH*j), i, j];
            NSString *verticalConstraint = [NSString stringWithFormat:@"V:|-%d-[led%d_%d]", (LED_HEIGHT*i), i, j];
            [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:horizontalConstraint options:0 metrics:nil views:self.leds]];
            [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:verticalConstraint options:0 metrics:nil views:self.leds]];
        }
    }

如果有人知道我做错了什么或更好的方法,请分享并帮助!!

谢谢大家。

1 个答案:

答案 0 :(得分:0)

有几个想法是如何创建约束。如果必须使用可视格式语言,则使用度量字典更清晰。度量字典允许您将变量用于距离而不是使用NSStringWithFormat。例如

     NSNumber *distanceFromLeft = @(LED_WIDTH*j);
    id led = ....;
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-distanceFromLeft-[led]" options:0 metrics:NSDictionaryOfVariableBindings(distanceFromLeft) views:NSDictionaryOfVariableBindings(led)]];

我知道这不是即插即用的代码,但我希望它有意义。

如果是我,我可能会单独获取每个视图并使用constraintWithItem方法。它有点冗长,并且会占用更多的行但是它看起来更清晰,并且可能比视觉格式字符串更具可读性,并且您已经进行了所有替换。您也不需要创建和维护视图字典。由于您实际上只创建了一个约束来固定视图x和y距离超视图的左侧和顶部的距离,因此约束非常简单

    id view1 = //pull the view from your array, or run this when you create the view itself.
    [self addConstraint:[NSLayoutConstraint
                         constraintWithItem:view1
                         attribute:NSLayoutAttributeLeft
                         relatedBy:NSLayoutRelationEqual
                         toItem:self
                         attribute:NSLayoutAttributeLeft
                         multiplier:1
                         constant:LED_WIDTH*j]];

    [self addConstraint:[NSLayoutConstraint
                         constraintWithItem:view1
                         attribute:NSLayoutAttributeTop
                         relatedBy:NSLayoutRelationEqual
                         toItem:self
                         attribute:NSLayoutAttributeTop
                         multiplier:1
                         constant:LED_WIDTH*i]];

我想知道只是设置帧不会更容易,是否有理由需要使用autolayout?