KeepLayout 1.2.2

KeepLayout 1.2.2

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最新发布2014年12月

Martin Kiss 维护。



  • 作者
  • Martin Kiss

Keep Layout

Keep Layout 是一个正在积极开发中的项目,其目的是使从 代码 中使用 Auto Layout 变得更加容易!不再需要 Interface BuilderVisual FormatKeep Layout 提供了创建和访问现有约束的简单、更易读且强大的 API。

在您开始之前,您应该熟悉 Auto Layout 主题。 它是如何工作的,有什么目的?

属性

每个视图都有几个 属性,这些属性由 KeepAttribute 类表示。

  • 尺寸:宽度高度纵横比
  • 到父视图的 内边距
  • 在父视图中的位置:水平 垂直
  • 到其他视图的偏移量:
  • 与其它视图的对齐方式:、水平 垂直、基线

可以通过在 UIView 对象上调用具有这些格式的方法来访问它们:

- (KeepLayout *)keep<AttributeName>;
- (KeepLayout *(^)(UIView *))keep<AttributeName>To; // 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)

有关更多信息,请参阅 UIView+KeepLayout.h

属性有三个属性:相等最小最大。它们不仅仅是普通的标量值,而是一个表示具有优先级的 struct

可以使用其中四个便利函数之一创建它,每个基本布局优先级一个:

KeepValue value = KeepRequired(42);
value = KeepHigh(42);
value = KeepLow(42);
value = KeepFitting(42);

// Arbitrary priority:
value = KeepValueMake(42, 800);

优先级重新声明为使用 UILayoutPriority 值的 KeepPriority 枚举,并使用相似的命名:

Required > High > Low > Fitting
1000       750    250   50

有关更多信息,请参阅 KeepTypes.h

组合在一起 - 示例

将视图的宽度保持为等于 150,具有高优先级

view.keepWidth.equal = KeepHigh(150);

将视图到父视图的上内边距至少设置为 10,没有借口

view.keepTopInset.min = KeepRequired(10);

不要让第一个视图从左侧比第二个视图靠近 10 个单位

firstView.keepLeftOffsetTo(secondView).min = KeepRequired(10);

有关更多信息,请参阅项目内包含的 示例 应用。


组合属性

您通常希望将多个属性设置为相同的值。为此,我们提供了分组属性

您可以自己创建分组。

KeepAttribute *leftInsets = [KeepAttribute group:
                             viewOne.keepLeftInset,
                             viewTwo.keepLeftInset,
                             viewThree.keepLeftInset,
                             nil];
leftInsets.equal = KeepRequired(10);

然而,已经有了一些访问器可以访问这些分组中的一些。

view.keepSize    // group of both Width and Height
view.keepInsets  // group of all four insets
view.keepCenter  // group of both axis of position

请参阅UIView+KeepLayout.hKeepAttribute.h获取更多信息。

可移除的分组

可移除的分组是一种一次性移除多个属性(或其值)的方法。使用这种方法,您可以快速将一个约束集(=布局)更改为另一个。

// Create removable group
removableLayout = [KeepAttribute removableChanges:^{
    self.view.keepWidth.min = KeepHigh(320); // Set minimum width limit.
    self.view.keepVerticalInsets.equal = KeepRequired(0); // Vertically stretch to fit.
}];
// Group now contains all attributes that were changed in the block.

[removableLayout remove];
// 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 remove]; // Removes all constraints for width.

有关详细信息,请参阅KeepAttribute.h

便利方法

对于大多数常用情况,都有便利方法。没有您自己可以写的东西,但它可以简化代码并提高可读性。其中一些:

[view keepSize:CGSizeMake(100, 200)];
[view keepInsets:UIEdgeInsetsMake(10, 20, 30, 40)];
[view keepCentered];

有关更多信息,请参阅 UIView+KeepLayout.h

数组属性 – 什么是?

添加到UIView类的大多数方法也可以在任何视图的数组上调用。这样的调用会创建所有包含视图属性的分组属性。

NSArray *views = @[ viewOne, viewTwo, viewThree ];
views.keepInsets.min = KeepRequired(10);

上面的代码创建并配置了12个布局约束!

此外,数组还允许您使用其他便利方法更轻松地使用相关属性

NSArray *views = @[ viewOne, viewTwo, viewThree ];
[views keepWidthsEqual];
[views keepHorizontalOffsets:KeepRequired(20)];
[views keepTopAligned];

有关更多信息,请参阅NSArray+KeepLayout.h

动画

约束可以进行动画处理。您可以使用简单的UIView块动画,但需要在动画块的末尾调用-layoutIfNeeded。这会触发-layoutSubviews,该操作应用新约束。

或者您可以使用提供的方法之一,这样您就不必关心了

view.keepWidth.equal = KeepRequired(100);

[view.superview keepAnimatedWithDuration:1 layout:^{
    view.keepWidth.equal = KeepRequired(200);
}];

这些是实例方法,必须在受影响的子视图的父视图中调用。在布局块的末尾,该视图接收-layoutIfNeeded方法。任何非接收者子视图树中的视图更改都不会进行动画。

iOS 7及以上版本支持Spring动画。

有关更多信息,请参阅 UIView+KeepLayout.h

调试

Keep Layout使用自己的NSLayoutConstraint子类,该子类覆盖了-debugDescription方法。一旦您收到错误消息无法同时满足约束。,您将看到每个已创建约束的良好可读性描述。例如

"<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

每个属性最多管理三个约束(NSLayoutConstraint),在需要时创建、更新和移除。对于三个关系(NSLayoutRelation枚举)中的每个关系都创建一个约束,并通过设置等于、最小或最大属性来修改它们。
有关详细信息,请参阅KeepAttribute.m

KeepAttribute类是一个类簇,具有特定的子类。其中一个通过使用常量值管理约束,一个用于使用乘数的约束,还有一个分组子类,它将原始方法转发到其包含的子类。
有关详细信息,请参阅KeepAttribute.m

数组方法通常会对包含的视图使用相同的选择器,并返回一组返回的属性。
有关详细信息,请参阅NSArray+KeepLayout.m

动画延迟是以实际执行延迟实现的,而不仅仅是动画变化的延迟。这与 UIView 块动画不同,允许您将与初始布局相同的更新周期设置动画。
有关详细信息,请参阅UIView+KeepLayout.m


版本 1.2.2

MIT 许可证,版权©2013 Martin Kiss

软件按“原样”提供, ...)