PLVisualAttributeConstraints 是一个小型库,使得创建布局约束变得更容易(查看:NSLayoutConstraint 类)。
如果您对 AutoLayout 机制不是很了解,我强烈建议您查看此处了解更多信息。
PLVisualAttributeConstraints 不试图取代标准的 VFL (可视化格式语言) 或更改 Apple 的默认机制。它与它们无缝集成,大大提高了开发者的生产力和代码可读性。
简而言之,有两个视图...
UIView *firstViewObj = ...
UIView *secondViewObj = ...
使用这个库,您可以创建类似以下的布局约束...
NSDictionary *views = @{
@"firstView" : firstViewObj,
@"secondView" : secondViewObj
};
NSLayoutConstraint *constraint1 =
[NSLayoutConstraint attributeConstraintWithVisualFormat:@"secondView.left >= firstView.left * 2 + 10"
views:views];
而不是标准的
NSLayoutConstraint *constraint2 =
[NSLayoutConstraint constraintWithItem:secondViewObj
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationGreaterThanOrEqual
toItem:firstViewObj
attribute:NSLayoutAttributeLeft
multiplier:2
constant:10];
这两个约束 (constraint1
和 constraint2
) 相互之间是 相同的。
您可能会有很多约束(这是一个常见的场景)。注意,您只需要创建 一次 包含视图的字典(例如,在创建约束方法的开头),然后继续使用类似的一行代码创建它们(如上面的示例所示),或者您还可以利用另一个方法
NSArray *constraints = [NSLayoutConstraint attributeConstraintsWithVisualFormatsArray:@[
@"secondView.left <= firstView.left - 10",
@"secondView.right >= firstView.right + 10",
@"secondView.top == firstView.bottom * 2.5 + 5",
] views:views];
在此处不介绍正式的语法,但我相信几个示例就足以让您入门。
control1.top >= control2.bottom + 20
control1.top <= control2.bottom - 20.5
control1.top == control2.bottom * 2.3 + 4.5
control1.top >= control2.bottom * 2 - 10
有一点点技巧(请继续阅读以了解原因):control1.top >= 100
control1.top == 100.5
top
,bottom
,left
,right
,leading
,trailing
,width
,height
,centerx
,centery
,baseline
(不区分大小写)这些属性与 这些枚举 一一对应。
==
,>=
,<=
(与这些枚举一一映射)
要查看库发挥作用的情况(以及与标准创建约束的方法进行比较),请检查项目。通过*.xcworkspace
打开它,而不要使用*.xcproject
文件(为什么?CocoaPods)。是的,我知道这个例子有些人为制作,但是它足够了。如果您有更好的演示准备建议,请提交拉取请求:)
如前所述,支持类似control1.top >= 100
(右侧没有属性,只有常量)的格式。
整个库是对此方法的薄包装,并且当我们读取
约束的形式为
view1.attr1 <relation> view2.attr2 * multiplier + constant
。如果您要表达约束没有第二个视图和属性,请使用nil
和NSLayoutAttributeNotAnAttribute
。
嗯……这适用于左侧有width
或height
属性的约束(例如control1.width == 100
)。对于任何其他属性(例如top
,left
……),在创建约束时会抛出异常……这在某些情况下是有意义的。
有时您可能仍然想创建这样一条约束。在这种情况下,您可以创建control1.top == control1.top * 0 + 50
,这应该与control1.top == 50
具有完全相同的行为:)
TL;DR
约束如control1.top >= 100
会自动创建为control1.top >= control1.top * 0 + 100
,我认为这有点像黑客技术,因此在此进行说明。
只需将PLVisualAttributeConstraints/PLVisualAttributeConstraints/*
下的源文件复制到您的项目中。支持通过CocoaPods安装将很快到来。
卡米尔·尤沃尔斯基([email protected]),Polidea