Keep Layout 使得 Auto Layout 的使用变得更加简单 从代码中!不再需要 Interface Builder 或 Visual Format。Keep Layout 提供了创建和 访问 约束的 简单、更易读且强大的 API。
在开始之前,您应该熟悉 Auto Layout 主题。 它是如何工作的?它的目的是什么?
项目状态:所有计划的功能都已实现并可用。项目得到维护,并与最新的 iOS/OS X 保持更新。请随时提交问题或拉取请求。
Swift 采用者:Swift 完全受支持,使用语法基本上是一样的。
起源:这个库最初是为 这个应用程序 制作的,特别是为其 iPad 界面。
每个视图都有几个 属性,这些属性由 KeepAttribute
类表示。
可以调用具有这些格式之一的方法来访问它们。
@property (readonly) KeepLayout *keep<AttributeName>;
@property (readonly) KeepLayout *(^keep<AttributeName>To)(UIView *)); // Returns block taking another view.
示例
KeepAttribute *width = view.keepWidth;
KeepAttribute *topOffset = view.keepTopOffsetTo(anotherView); // Invoking the block that returns the actual attribute.
首次调用此类方法会创建属性对象,任何后续调用都将返回相同的对象。对于与其他视图相关的属性,这适用于每一对视图。有时甚至是在相反的顺序或方向。
// aligns are the same regardless of order
viewOne.keepLeftAlign(viewTwo) == viewTwo.keepLeftAlign(viewOne)
// left offset from 1 to 2 is right offset from 2 to 1
viewOne.keepLeftOffset(viewTwo) == viewTwo.keepRightOffset(viewOne)
有关更多信息,请参阅 KeepView.h
。
属性有三个属性:等于、最小值 和 最大值。这些不仅仅是普通的标量值,但可能将有相关的 优先级。
默认情况下,优先级是必需的,但您可以使用提供的宏指定任意优先级
KeepValue value = 42; // value 42 at priority 1000
value = 42 +keepHigh; // value 42 at priority 750
value = 42 +keepLow; // value 42 at priority 250
value = 42 +keepFitting; // value 42 at priority 50
// Arbitrary priority:
value = 42 +keepAt(800); // value 42 at priority 800
优先级被重新声明为 KeepPriority
,使用 UILayoutPriority
值,并使用类似的名字
Required > High > Low > Fitting
1000 750 250 50
有关更多信息,请参阅 KeepTypes.h
。
将视图的宽度保持为等于 150
view.keepWidth.equal = 150;
将视图的顶部内边距保持为至少 10
view.keepTopInset.min = 10;
不让第一个视图比从左侧开始近 10 到第二个视图处
firstView.keepLeftOffsetTo(secondView).min = 10;
您经常会想要将多个属性设置为相同的值。为此,我们提供了分组属性。
您可以根据自己的需要创建分组
KeepAttribute *leftInsets = [KeepAttribute group:
viewOne.keepLeftInset,
viewTwo.keepLeftInset,
viewThree.keepLeftInset,
nil];
leftInsets.equal = 10;
然而,已经有一些访问器可以访问它们
view.keepSize // group of both Width and Height
view.keepInsets // group of all four insets
view.keepCenter // group of both axis of position
view.keepEdgeAlignTo // group of alignments to all four edges
有关更多信息,请参阅KeepView.h
或KeepAttribute.h
。
原子组是一种一次性停用多个属性的方法。使用原子组,您可以快速将一个所需的约束集(=布局)更改为另一个。
// Create atomic group
KeepAtomic *layout = [KeepAtomic layout:^{
self.view.keepWidth.min = 320 +keepHigh; // Set minimum width limit.
self.view.keepVerticalInsets.equal = 0; // Vertically stretch to fit.
}];
[layout deactivate];
// self.view no longer has minimum width of 320 and is no longer stretched vertically.
您还可以使用以下方法手动停用它们:
self.view.keepWidth.min = KeepNone; // Removes minimum width constraint.
[self.view.keepWidth deactivate]; // Removes all constraints for width.
有关详细信息,请参阅KeepAttribute.h
。
对于最常用的案例,有便利方法。这些方法不需要您自己编写,但可以简化代码并提高可读性。其中一些方法
[view keepSize:CGSizeMake(100, 200)];
[view keepInsets:UIEdgeInsetsMake(10, 20, 30, 40)];
[view keepCentered];
有关更多信息,请参阅 KeepView.h
。
添加到UIView
/NSView
类的几乎所有方法都可以在任何
NSArray *views = @[ viewOne, viewTwo, viewThree ];
views.keepInsets.min = 10;
上面的代码创建了并配置了12个布局约束!
此外,数组还允许您使用相关属性更容易地使用其他便利方法
NSArray *views = @[ viewOne, viewTwo, viewThree ];
[views keepWidthsEqual];
[views keepHorizontalOffsets:20];
[views keepTopAligned];
您已经创建了6个新的布局约束,您注意到了吗?
有关更多信息,请参阅NSArray+KeepLayout.h
。
约束可以动画。您可以使用简单的UIView
块动画,但需要在动画块的最后调用-layoutIfNeeded
。这会触发-layoutSubviews
,which applies new constraints。
或者您可以使用提供的方法,这样您就不需要关心
view.keepWidth.equal = 100;
[view.superview keepAnimatedWithDuration:1 layout:^{
view.keepWidth.equal = 200;
}];
这些是实例方法,必须在所有受影响子视图的父视图中调用。在布局块结束时,该视图接收到-layoutIfNeeded
方法。不会为接收者子视图树之外的任何视图动画。
iOS 7包括弹簧动画,但OSX上的动画尚未支持。
有关更多信息,请参阅 KeepView.h
。
KeepLayout向每个UIViewController
添加了懒加载的不可见.keepLayoutView
(分类)。此视图与视图控制器顶部& &底部布局指南以及左侧& &右侧边距对齐,这意味着其大小代表视图控制器可见部分。您可以使用此布局视图将视图与半透明栏(导航栏、工具栏、状态栏或标签栏)对齐。
imageView.keepEdgeAlignTo(controller.keepLayoutView).equal = 0;
// imageView will not be covered by UINavigationBar or UITabBar
要了解更多信息,请参阅UIViewController+KeepLayout.h
。
Keep Layout使用自己的NSLayoutConstraint
子类,它重写了-debugDescription
方法。一旦您收到错误消息 Unable to simultaneously satisfy constraints.
,您将看到所创建的每个约束的清晰描述。示例
"<KeepLayoutConstraint:0xc695560 left offset of <YourView 0xc682cf0> to <YourAnotherView 0xc681350> equal to 20 with required priority>",
"<KeepLayoutConstraint:0xc695560 left offset of <YourView 0xc682cf0> to <YourAnotherView 0xc681350> equal to 50 with required priority>",
有了这个,您可以非常容易地找到错误的属性并修复它。
要了解更多信息,请参阅KeepLayoutConstraint.h
。
访问属性后将其创建并关联到给定的视图(运行时关联)。在相关属性的情况下,使用第二个视图作为NSMapTable
中的弱键。
要了解更多信息,请参阅UIView+KeepLayout.m
。
KeepValue
声明为_Complex double
,这使得它可以无缝地从double
转换而来并转换出去。优先级存储为虚部。
要了解更多信息,请参阅KeepTypes.h
。
每个属性最多管理三个约束(NSLayoutConstraint
),当需要时创建、更新并删除。每个关系(NSLayoutRelation
枚举)有一个约束,并且设置equal
、min
或max
属性会修改它们。
要了解更多信息,请参阅KeepAttribute.m
。
KeepAttribute
类是一个具有特定子类类的簇。其中包括一个使用 constant
值来管理约束,一个用于使用 multiplier
的约束,以及一个将原始方法转发到其包含子类的分组子类。
要了解更多信息,请参阅KeepAttribute.m
。
数组方法通常在包含的视图中调用相同的选择器,并返回返回属性的组。
有关详细信息,请参阅 NSArray+KeepLayout.m
.
动画延迟实现为实际执行延迟,而不仅仅是动画更改的延迟。这不同于 UIView
块动画,允许你在你的初始布局相同的更新周期中设置动画。
有关详细信息,请参阅 KeepView.m
.
版本 1.7.0
MIT 许可证,版权所有 © 2013-2016 Martin Kiss
软件按“原样”提供,等等...
请参阅 LICENSE.md
以获取更多。