TULayoutAdditions
是一组辅助对象和类别集合,使 iOS 上的自动布局变得更加简单。
TULayoutAdditions.h
。查看示例项目。
使用传统的自动布局,您将编写所有这些
greenView.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[greenView]-(10)-[redView]"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(redView, greenView)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[blueView]-(>=10)-[greenView(100@250)]"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(blueView, greenView)]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:greenView attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:redView
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:0.0]];
但是使用 TULayoutAdditions
,您将执行以下操作
greenView.constrainedTop = [[blueView.constrainedBottom greaterThanOrEqual] plus:10.0];
greenView.constrainedBottom = redView.constrainedBottom;
greenView.constrainedHeight = [[@100 constraint] withPriority:UILayoutPriorityDefaultLow];
greenView.constrainedRight = [redView.constrainedLeft minus:10.0];
greenView.constrainedLeft = @10;
虽然视觉格式化语言很有用,但大量选项、需要传入您所使用的视图以及它是表示为不能在编译时产生警告或自动完成的字符串,这些使得编写过程冗长并消耗时间。
TULayoutAdditions
以以 constrained
开头的属性为中心,例如 constrainedHeight
、constrainedCenterX
等。当您获得其中一个属性时,将创建一个包含视图和属性信息的 TUConstraintInfo
实例。然后您可以操作属性,甚至将它们链接在一起。或者,您可以使用 NSNumber
来生成 TUConstraintInfo
对象,它可以作为常量,例如与高度和宽度一起使用,或者对于位置属性(顶部、左边、中心等)将隐式使用父视图。
请注意运算符的顺序不适用于 plus
(加号)/ minus
(减号)/ times
(乘号)/ dividedBy
(除号)。如果您先添加,然后乘以,则常数不会被乘以。功能始终为 mX + b
。
一旦您有了 TUConstraintInfo
对象,您就可以将其设置在另一个视图的 constrained
属性上。当您在视图中设置约束信息时,它会自动创建约束并将其添加到正确的视图上。它还将设置两个视图的 translatesAutoresizingMaskIntoConstraints
,除非一个是另一个的父视图(这样做是为了设置约束时不会使父视图的约束无效)。
您可以通过以下两种方式之一获取创建的 NSLayoutConstraint
的引用。
您可以使用 +[UIView constraintsWithBlock:]
在块中创建所有约束,然后获取所有创建的约束数组。
NSArray *greenConstraints = [UIView constraintsWithBlock:^{
greenView.constrainedTop = [[blueView.constrainedBottom greaterThanOrEqual] plus:10.0];
greenView.constrainedBottom = redView.constrainedBottom;
greenView.constrainedHeight = [[@100 constraint] withPriority:UILayoutPriorityDefaultLow];
greenView.constrainedRight = [redView.constrainedLeft minus:10.0];
greenView.constrainedLeft = @10;
}];
返回的约束将仅包括使用 setConstrainedX:
方法或 -[UIView setConstraintWithAttribute:info:
方法创建的约束。
每个 setConstrainedX:
方法都保证每次调用时创建一个且仅创建一个约束。这意味着您可以可靠地执行以下操作
NSLayoutConstraint *greenConstraint = [UIView constraintsWithBlock:^{
greenView.constrainedLeft = @10;
}].lastObject;
setConstrainedX:
方法仅是调用带有相应 NSLayoutAttribute
的 -[UIView setConstraintWithAttribute:info:]
,这将反过来调用 -[UIView constraintWithAttribute:info:]
并添加它。您也可以自己使用这些方法
NSLayoutConstraint *constraint = [greenView constraintWithAttribute:NSLayoutAttributeLeft info:@10];
[constraint add];