华氏是一个小型库,它提供了一个更好的 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
替换为您想要的任何标识符。