Ios 如何处理代码中的NSLayoutConstraint冗长?
我已经开始欣赏为我所做的工作,但我与布伦特·西蒙斯(Brent Simmons)的主题是设置约束。苹果提供的界面非常灵活,但非常冗长——显然是为代码生成器设计的,而不是人为使用的。对我来说,它是Objective-C中最糟糕的例子,重复使用过长的相同前缀,很少使用参数来混淆所有含义,而不是提供代码的清晰性。我看到它在Ios 如何处理代码中的NSLayoutConstraint冗长?,ios,autolayout,Ios,Autolayout,我已经开始欣赏为我所做的工作,但我与布伦特·西蒙斯(Brent Simmons)的主题是设置约束。苹果提供的界面非常灵活,但非常冗长——显然是为代码生成器设计的,而不是人为使用的。对我来说,它是Objective-C中最糟糕的例子,重复使用过长的相同前缀,很少使用参数来混淆所有含义,而不是提供代码的清晰性。我看到它在UIView上的类别中隐藏了约束创建 还有其他方法可以使代码中的布局约束更清晰、更容易理解吗?我尽量靠近苹果的实现,承认存在NSLayoutConstraint,因此,我简单地定义了
UIView
上的类别中隐藏了约束创建
还有其他方法可以使代码中的布局约束更清晰、更容易理解吗?我尽量靠近苹果的实现,承认存在
NSLayoutConstraint
,因此,我简单地定义了一组,从属性和关系中删除前缀,并将约束创建包装在一个构造函数(如宏)中(也省略了我从未使用过的乘数参数):
约束
ConstantConstraint
VisualConstraints
VisualConstraintWithMetrics
[self.view添加约束:
@[Constraint(_verticalSeparator,CenterX,Equal,_top,CenterX,0),
约束(_垂直分隔符,中心,相等,_顶部,中心,+22),
约束(_垂直分隔符,高度,相等,_本地天气,高度,0),
约束(_localWeather,CenterY,Equal,_verticalSeparator,CenterY,0),
约束(_addLocation,CenterY,Equal,_verticalSeparator,CenterY,0),
约束条件(_接地,尾随,相等,_垂直分隔符,尾随,-1),
约束条件(_着陆,中心,相等,_本地天气,中心,0),
约束条件(_着陆,宽度,相等,_本地天气,宽度,+26),
约束条件(_着陆,高度,相等,_本地天气,高度,0)
]];
id f=@“[\u localWeather]-space-[\u垂直分隔符]-space-[\u addLocation]”;
[self.view添加约束:
VisualConstraintWithMetrics(f,{“空间”:@11},
_localWeather,_verticalSeparator,_addLocation)];
[_tablecelladdconstraint:ConstantConstraint(_tableCell,Height,Equal,44)];
在处理共享相同设置的一组视图时,我列举了如下数组文字:
[@[\u顶部、中间、底部、接地、垂直分隔符]
enumerateObjectsUsingBlock:^(UIView*视图,整数idx,布尔*停止){
view.translatesAutoresizingMaskIntoConstraints=否;
[self.view addSubview:view];
}];
水平填充superview
的情况非常频繁,以至于它被提升到自己的宏中:
[@[_-top,_-middle,_-bottom]enumerateObjectsUsingBlock:horizontallyFillSuperview];
随着我的风格的发展,我会更新这个答案…Jonas Budelmann的是一个用于自动布局的DSL,它比手动创建的布局约束的行和行更具可读性。
通过
它还具有用于设置边、大小和中心的复合约束:
//使上、左、下、右视图相等2
make.edges.equalTo(视图2);
//使top=superview.top+5,left=superview.left+10,
//bottom=superview.bottom-15,right=superview.right-20
make.Edge.equalTo(superview).插图(UIEdgeInsetsMake(5,10,15,20))
//使宽度和高度大于或等于标题标签
制造。尺寸。大于或等于(标题标签)
//使宽度=superview.width+100,高度=superview.height-50
make.size.equalTo(superview).sizeOffset(CGSizeMake(100,-50))
//使centerX和centerY=按钮1
make.center.equalTo(按钮1)
//使centerX=superview.centerX-5,centerY=superview.centerY+10
make.center.equalTo(superview).centerOffset(CGPointMake(-5,10))
您还可以使用lib来指定约束。
该库的主要思想是不与NSLayoutConstraint本身保持距离,并允许您根据需要使用constraint进行操作
例如:
[self.view addConstraints:
@[Constraint(_verticalSeparator, CenterX, Equal, _top, CenterX, 0),
Constraint(_verticalSeparator, CenterY, Equal, _top, CenterY, +22),
Constraint(_verticalSeparator, Height, Equal, _localWeather, Height, 0),
Constraint(_localWeather, CenterY, Equal, _verticalSeparator, CenterY, 0),
Constraint(_addLocation, CenterY, Equal, _verticalSeparator, CenterY, 0),
Constraint(_touchDown, Trailing, Equal, _verticalSeparator, Trailing, -1),
Constraint(_touchDown, CenterY, Equal, _localWeather, CenterY, 0),
Constraint(_touchDown, Width, Equal, _localWeather, Width, +26),
Constraint(_touchDown, Height, Equal, _localWeather, Height, 0)
]];
id f = @"[_localWeather]-space-[_verticalSeparator]-space-[_addLocation]";
[self.view addConstraints:
VisualConstraintWithMetrics(f, @{@"space": @11},
_localWeather, _verticalSeparator, _addLocation)];
将看起来像:
[self.view addConstraints PVGroup(@[
PVCenterXOf(_verticalSeparator).equalTo.centerXOf(_top),
PVCenterYOf(_verticalSeparator).equalTo.centerYOf(_top).plus(22),
PVHeightOf(_verticalSeparator).equalTo.heightOf(_localWeather),
PVCenterYOf(_localWeather).equalTo.centerYOf(_verticalSeparator),
PVCenterYOf(_addLocation).equalTo.centerYOf(_verticalSeparator),
PVTrailingOf(_touchDown).equalTo.trailingOf(_verticalSeparator).minus(1),
PVCenterYOf(_touchDown).equalTo.centerYOf(_localWeather),
PVWidthOf(_touchDown).equalTo.widthOf(_localWeather).plus(26),
PVHightOf(_touchDown).equalTo.heightOf(_localWeather),
PVVFL("[_localWeather]-space-[_verticalSeparator]-space-[_addLocation]"),
]).withViews(NSDictionaryOfVariableBindings(_localWeather, _verticalSeparator, _addLocation))
.withMetrics(@{@"space": @11}).asArray];
也可以处理不正确的情况,如
Constraint(_verticalSeparator, CenterY, Equal, _top, Width, +22)
等等
Constraint(_verticalSeparator, CenterY, Equal, _top, Width, +22)