一直在搜索,无法找到任何解决方案。
我有一个视图,它将在初始化参数中包含一定数量的子视图。
我想以编程方式使用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]];
}
}
如果有人知道我做错了什么或更好的方法,请分享并帮助!!
谢谢大家。
答案 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?