如何使用 NSLayoutConstraint 将宽度固定到某些 UIView?
How to pin Widths Equally to some UIViews with NSLayoutConstraint?
如何使用 NSLayoutConstraints 固定两个以上宽度相同的 UIView?
现在,我正在使用以下代码,但无法固定两个以上的 UIView:
for (int i = 0; i < column.count; i++) {
NSString *horizontalFormat = @"H:|[view1][view2(==view1)]|";
NSDictionary *views;
if (i < column.count - 1) {
views = @{
@"view1": column[i],
@"view2": column[i + 1]
};
}else{
views = @{
@"view1": column[i - 1],
@"view2": column[i]
};
}
NSArray * horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:horizontalFormat
options:NSLayoutFormatAlignAllTop | NSLayoutFormatAlignAllBottom
metrics:nil
views:views];
[self.contentView addConstraints:horizontalConstraints];
}
有什么想法吗?
每个 NSLayoutConstraint 只能关联两个视图,但没有什么能阻止您添加额外的约束。例如:
[NSLayoutConstraint constraintWithItem:column[i-1] attribute: NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:column[i] attribute:NSLayoutAttributeWidth multiplied:1.f constant:0.f];
[NSLayoutConstraint constraintWithItem:column[i+1] attribute: NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:column[i] attribute:NSLayoutAttributeWidth multiplied:1.f constant:0.f];
如果添加这两个约束,"columns" 处的 i-1、i 和 i+1 现在都将具有相同的宽度。
举个例子。所有视图都是在代码中生成的,因此只需将此代码复制到 UIViewController 中(例如,复制到它的 viewDidLoad
中)和 运行 it:
UIView* v1 = [[UIView alloc] init];
v1.layer.borderWidth = 2;
v1.layer.borderColor = [UIColor redColor].CGColor;
v1.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:v1];
[NSLayoutConstraint activateConstraints:
@[[v1.topAnchor constraintEqualToAnchor:self.view.topAnchor constant:100],
[v1.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
[v1.heightAnchor constraintEqualToConstant:40],
]];
NSInteger n = 6; // change this number as desired
NSMutableArray* marr = [NSMutableArray new];
[marr addObject:v1];
for (NSInteger i = 1; i < n; i++) {
UIView* v = [[UIView alloc] init];
v.layer.borderWidth = 2;
v.layer.borderColor = [UIColor redColor].CGColor;
v.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:v];
[marr addObject:v];
}
for (NSInteger i = 1; i < n; i++) {
UIView* v = marr[i];
UIView* prev = marr[i-1];
[NSLayoutConstraint activateConstraints:
@[[v.topAnchor constraintEqualToAnchor:v1.topAnchor],
[v.bottomAnchor constraintEqualToAnchor:v1.bottomAnchor],
[v.leadingAnchor constraintEqualToAnchor:prev.trailingAnchor],
[v.widthAnchor constraintEqualToAnchor:v1.widthAnchor]
]];
}
UIView* v = marr[n-1];
[NSLayoutConstraint activateConstraints:
@[[v.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor]
]];
如何使用 NSLayoutConstraints 固定两个以上宽度相同的 UIView?
现在,我正在使用以下代码,但无法固定两个以上的 UIView:
for (int i = 0; i < column.count; i++) {
NSString *horizontalFormat = @"H:|[view1][view2(==view1)]|";
NSDictionary *views;
if (i < column.count - 1) {
views = @{
@"view1": column[i],
@"view2": column[i + 1]
};
}else{
views = @{
@"view1": column[i - 1],
@"view2": column[i]
};
}
NSArray * horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:horizontalFormat
options:NSLayoutFormatAlignAllTop | NSLayoutFormatAlignAllBottom
metrics:nil
views:views];
[self.contentView addConstraints:horizontalConstraints];
}
有什么想法吗?
每个 NSLayoutConstraint 只能关联两个视图,但没有什么能阻止您添加额外的约束。例如:
[NSLayoutConstraint constraintWithItem:column[i-1] attribute: NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:column[i] attribute:NSLayoutAttributeWidth multiplied:1.f constant:0.f];
[NSLayoutConstraint constraintWithItem:column[i+1] attribute: NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:column[i] attribute:NSLayoutAttributeWidth multiplied:1.f constant:0.f];
如果添加这两个约束,"columns" 处的 i-1、i 和 i+1 现在都将具有相同的宽度。
举个例子。所有视图都是在代码中生成的,因此只需将此代码复制到 UIViewController 中(例如,复制到它的 viewDidLoad
中)和 运行 it:
UIView* v1 = [[UIView alloc] init];
v1.layer.borderWidth = 2;
v1.layer.borderColor = [UIColor redColor].CGColor;
v1.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:v1];
[NSLayoutConstraint activateConstraints:
@[[v1.topAnchor constraintEqualToAnchor:self.view.topAnchor constant:100],
[v1.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
[v1.heightAnchor constraintEqualToConstant:40],
]];
NSInteger n = 6; // change this number as desired
NSMutableArray* marr = [NSMutableArray new];
[marr addObject:v1];
for (NSInteger i = 1; i < n; i++) {
UIView* v = [[UIView alloc] init];
v.layer.borderWidth = 2;
v.layer.borderColor = [UIColor redColor].CGColor;
v.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:v];
[marr addObject:v];
}
for (NSInteger i = 1; i < n; i++) {
UIView* v = marr[i];
UIView* prev = marr[i-1];
[NSLayoutConstraint activateConstraints:
@[[v.topAnchor constraintEqualToAnchor:v1.topAnchor],
[v.bottomAnchor constraintEqualToAnchor:v1.bottomAnchor],
[v.leadingAnchor constraintEqualToAnchor:prev.trailingAnchor],
[v.widthAnchor constraintEqualToAnchor:v1.widthAnchor]
]];
}
UIView* v = marr[n-1];
[NSLayoutConstraint activateConstraints:
@[[v.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor]
]];