华氏是一个小型库,它提供了一个更好的 API 来在代码中构建视图层次结构。华氏使用 Masonry 进行自动布局,并在 iOS 和 OSX 上运行。
为了演示,让我们构建一个简单的视图层次结构,包含嵌套在 self.view 里面的 2 个视图。
UIView *view1 = [UIView new];
view1.backgroundColor = [UIColor redColor];
[self.view addSubview:view1]
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(view1.superview);
}];
UIView *view2 = [UIView new];
view2.backgroundColor = [UIColor blueColor];
[view1 addSubview:view2];
[view2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(view1);
}];UIView *view1, *view2;
ºº(self.view) {
view1 = º(UIView) {
_.backgroundColor = [UIColor redColor];
_.make.edges.equalTo(superview);
view2 = º(UIView) {
_.backgroundColor = [UIColor blueColor];
_.make.edges.equalTo(superview);
};
};
};(在 OSX 上按 ⌥-0 可以键入 º)
_ 和 superview 总是绑定到当前视图,因此将行从一个块移动到另一个块时会自动影响其移动到的视图。对每个 º 的调用都将给定的视图添加为子视图,添加到最近调用的嵌套 ºº 或 º 中传递的视图。视图的顺序将决定于 º 调用的顺序。
º 的调用必须在 ºº 的调用内部。由于它不嵌套在任何其他调用内,所以 ºº 不会将给定的视图作为子视图添加到任何东西。
在 º 宏之后的块中,_ 指的是给定的视图,而 superview 指的是该视图的父视图。 _.make 被设置为给定的视图的 MASConstraintMaker,类似于传递给 Masonry 的 mas_makeConstraints: 方法的块。
在 º 块之后的块将只被执行一次,一旦内部块中所有的其他内容都运行一遍,所以同一层次结构级别分配的所有视图都可以相互引用。例如
ºº(self) {
UIView *one, *two;
one = º(UIView) {
// Even though two is assigned below, it will not be nil here!
_.make.left.equalTo(two);
};
two = º(UIView) {
// one won't be nil here either.
_.make.top.equalTo(one);
};
};当将实例作为 º 的第一个参数传递时,使用 typeof 来确定实例的类型。在某些情况下,typeof 可能无法确定类型,或者得到的类型过于通用(例如,当你知道它更具体时,它是 id)。如果发生这种情况,你可以自己将实例转换为类型
ºº(self) {
º((UIButton *)[UIButton buttonWithType:UIButtonTypeCustom]) {
<... _ now has type UIButton*, even though buttonWithType: returns id ...>
};
};华氏度可以通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 中
pod 'Fahrenheit'如果您不喜欢 º 或 ºº 符号(或者您已找到更好的用途),可以配置 Fahrenheit 使用您想要的任何符号。在导入 Fahrenheit 之前,将以下 3 行代码添加到 prefix.pch 中
#define FAHRENHEIT_CUSTOM_MACRO_NAMES
#define f(args...) FAHRENHEIT(args)
#define F(args...) FAHRENHEIT_TOPLEVEL(args)...现在您可以使用 f 代替 º,以及 F 代替 ºº。您可以将示例中的 f 和 F 替换为您想要的任何标识符。