一个简单的 NSLayoutConstraint 表达式解析器,用于编写更易读的 autolayout 代码。由 Marco Arment 编写,并使用 MIT 许可证发布(见 LICENSE 文件)。
Apple 的 视觉格式语法非常有用,但它无法表示所有类型的 autolayout 约束,并且对于简单的值来说并不理想。手动创建 NSLayoutConstraints 更强大,且涵盖所有可能性,但非常啰嗦而且难以阅读。
CompactConstraint 将紧凑、易读的语法带到了手动创建 NSLayoutConstraints 中。简而言之,您不需要像这样编写 Cocoa autolayout 约束
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:emailLabel attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:emailField attribute:NSLayoutAttributeLeft multiplier:1.0f constant:0.0f]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:spinner attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:logInButton attribute:NSLayoutAttributeRight multiplier:1.0f constant:10.0f]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:preview attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:preview attribute:NSLayoutAttributeWidth multiplier:0.625f constant:0.0f]];
CompactConstraint 允许您这样编写
[self.view addCompactConstraint:@"emailLabel.left >= emailField.left" metrics:metrics views:views];
[self.view addCompactConstraint:@"spinner.left = logInButton.right + 10" metrics:metrics views:views];
[self.view addCompactConstraint:@"preview.height = preview.width / 1.6" metrics:metrics views:views];
或者这样
[self.view addCompactConstraints:@[
@"emailLabel.left >= emailField.left",
@"spinner.left = logInButton.right + 10",
@"preview.height = preview.width / 1.6"
] metrics:metrics views:views];
CompactConstraint 语法直接映射到 NSLayoutConstraint 的内置方法 constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:
所传递的参数
leftItem.attribute [= == <= >=] rightItem.attribute [* /] multiplier [+ -] constant
leftItem
和 rightItem
都是来自提供的 views
字典的键,映射到 UIView,就像 Apple 的视觉格式语言调用一样。
rightItem
可能是 "super",这将被解释为 leftItem
的父视图。如果您在 views
中指定了 @"super"
键,则您的提供值将被使用。
multiplier
和 constant
是可选的。另外,rightItem.attribute
、multiplier
和 constant
都可以由提供的 metrics
字典中的条目替换,映射到 NSNumbers。
有效的属性只是 NSLayoutAttribute
定义末尾的以小写字母开头的部分
left
right
top
bottom
leading
trailing
width
height
centerX
centerY
baseline
例如,给定以下字典作为 views
和 metrics
参数
NSDictionary *views = @{
@"button" : self.button,
@"label" : self.label,
@"spinner" : activitySpinner,
};
NSDictionary *metrics = @{
@"buttonHeight" : @(36),
@"spacing" : @(15),
@"scale" : @(1.25),
};
这些都将有效的 CompactConstraint 语法
button.centerX = super.centerX
label.width = button.width * scale + 40
spinner.left = button.right + 10
button.height = buttonHeight
spinner.height = 40
只需将 CompactConstraint
目录中的少数几个文件包含到您的项目中,并在您想要使用它的任何地方(或在预编译头文件中):#import "CompactConstraint.h"
对我来说已经足够快了。试试看它是否对您来说也足够快。