Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何处理代码中的NSLayoutConstraint冗长?_Ios_Autolayout - Fatal编程技术网

Ios 如何处理代码中的NSLayoutConstraint冗长?

Ios 如何处理代码中的NSLayoutConstraint冗长?,ios,autolayout,Ios,Autolayout,我已经开始欣赏为我所做的工作,但我与布伦特·西蒙斯(Brent Simmons)的主题是设置约束。苹果提供的界面非常灵活,但非常冗长——显然是为代码生成器设计的,而不是人为使用的。对我来说,它是Objective-C中最糟糕的例子,重复使用过长的相同前缀,很少使用参数来混淆所有含义,而不是提供代码的清晰性。我看到它在UIView上的类别中隐藏了约束创建 还有其他方法可以使代码中的布局约束更清晰、更容易理解吗?我尽量靠近苹果的实现,承认存在NSLayoutConstraint,因此,我简单地定义了

我已经开始欣赏为我所做的工作,但我与布伦特·西蒙斯(Brent Simmons)的主题是设置约束。苹果提供的界面非常灵活,但非常冗长——显然是为代码生成器设计的,而不是人为使用的。对我来说,它是Objective-C中最糟糕的例子,重复使用过长的相同前缀,很少使用参数来混淆所有含义,而不是提供代码的清晰性。我看到它在
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)