Space 均匀分布在视图中,没有边距
Space evenly across a view without margins
我使用以下函数 space 视图中的动态视图数(使用自动布局):
-(NSArray*)spaceViews:(NSArray *)views onAxis:(UILayoutConstraintAxis)axis
{
NSAssert([views count] > 1,@"Can only distribute 2 or more views");
NSLayoutAttribute attributeForView;
NSLayoutAttribute attributeToPin;
switch (axis) {
case UILayoutConstraintAxisHorizontal:
attributeForView = NSLayoutAttributeCenterX;
attributeToPin = NSLayoutAttributeRight;
break;
case UILayoutConstraintAxisVertical:
attributeForView = NSLayoutAttributeCenterY;
attributeToPin = NSLayoutAttributeBottom;
break;
default:
return @[];
}
CGFloat fractionPerView = 1.0 / (CGFloat)([views count] + 1);
NSMutableArray *constraints = [NSMutableArray array];
[views enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop)
{
CGFloat multiplier = fractionPerView * (idx + 1.0);
[constraints addObject:[NSLayoutConstraint constraintWithItem:view
attribute:attributeForView
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:attributeToPin
multiplier:multiplier
constant:0.0]];
}];
[self addConstraints:constraints];
return [constraints copy];
}
(函数来自UIView-Autolayout)
问题是它有边距。如何更改此方法才能使视图均匀 space 没有边距?
更新
看来该方法毕竟没有正常工作,外部项目的边距比其余项目高得多。
例如,我将左臂的代码更改为:
self.leftArm = [UIView autoLayoutView];
self.leftArm.backgroundColor = [UIColor grayColor];
[self.view addSubview:self.leftArm];
[self.leftArm pinAttribute:NSLayoutAttributeRight toAttribute:NSLayoutAttributeLeft ofItem:self.body withConstant:-10.0];
[self.leftArm pinAttribute:NSLayoutAttributeTop toSameAttributeOfItem:self.body withConstant:10.0];
[self.leftArm constrainToSize:CGSizeMake(20.0, 200.0)];
现在机器人看起来像这样:
请注意,左臂的视图分布不均匀,顶部和底部的边距要高得多。我可以水平重现相同的行为并且使用更少的项目。
我已经通过将外部视图与超级视图的侧面对齐并将其余部分对齐在 space 之间成功地去除了边距。但是现在,由于这个问题,我总是在外部视图和它们旁边的视图之间有更大的 spaces。
有谁知道如何纠正这个问题?
更新 2
我创建了一个叉子并向其中添加了我的功能,我还扩展了机器人示例以便您明白我的意思。
看起来这段代码来自 UIView-Autolayout。最新版本的库有一个新方法可以让你停止将间距添加到边缘:
-(NSArray*)spaceViews:(NSArray*)views
onAxis:(UILayoutConstraintAxis)axis
withSpacing:(CGFloat)spacing
alignmentOptions:(NSLayoutFormatOptions)options
flexibleFirstItem:(BOOL)flexibleFirstItem
applySpacingToEdges:(BOOL)spaceEdges;
只需调用此方法并将 NO
传递给最后一个参数。
我延长了jrturton's UIView-Autolayout (based on this answer) and created a pull request.
现在可以通过调用新函数无边距地均匀分布视图:
-(NSArray*)spaceViews:(NSArray *)views
onAxis:(UILayoutConstraintAxis)axis
withMargin:(BOOL)margin
并将边距参数设置为NO
。
您已经可以找到该版本的 UIView-Autolayout here。
牙齿等距视图的全新机器人:
我使用以下函数 space 视图中的动态视图数(使用自动布局):
-(NSArray*)spaceViews:(NSArray *)views onAxis:(UILayoutConstraintAxis)axis
{
NSAssert([views count] > 1,@"Can only distribute 2 or more views");
NSLayoutAttribute attributeForView;
NSLayoutAttribute attributeToPin;
switch (axis) {
case UILayoutConstraintAxisHorizontal:
attributeForView = NSLayoutAttributeCenterX;
attributeToPin = NSLayoutAttributeRight;
break;
case UILayoutConstraintAxisVertical:
attributeForView = NSLayoutAttributeCenterY;
attributeToPin = NSLayoutAttributeBottom;
break;
default:
return @[];
}
CGFloat fractionPerView = 1.0 / (CGFloat)([views count] + 1);
NSMutableArray *constraints = [NSMutableArray array];
[views enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop)
{
CGFloat multiplier = fractionPerView * (idx + 1.0);
[constraints addObject:[NSLayoutConstraint constraintWithItem:view
attribute:attributeForView
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:attributeToPin
multiplier:multiplier
constant:0.0]];
}];
[self addConstraints:constraints];
return [constraints copy];
}
(函数来自UIView-Autolayout)
问题是它有边距。如何更改此方法才能使视图均匀 space 没有边距?
更新
看来该方法毕竟没有正常工作,外部项目的边距比其余项目高得多。
例如,我将左臂的代码更改为:
self.leftArm = [UIView autoLayoutView];
self.leftArm.backgroundColor = [UIColor grayColor];
[self.view addSubview:self.leftArm];
[self.leftArm pinAttribute:NSLayoutAttributeRight toAttribute:NSLayoutAttributeLeft ofItem:self.body withConstant:-10.0];
[self.leftArm pinAttribute:NSLayoutAttributeTop toSameAttributeOfItem:self.body withConstant:10.0];
[self.leftArm constrainToSize:CGSizeMake(20.0, 200.0)];
现在机器人看起来像这样:
请注意,左臂的视图分布不均匀,顶部和底部的边距要高得多。我可以水平重现相同的行为并且使用更少的项目。
我已经通过将外部视图与超级视图的侧面对齐并将其余部分对齐在 space 之间成功地去除了边距。但是现在,由于这个问题,我总是在外部视图和它们旁边的视图之间有更大的 spaces。
有谁知道如何纠正这个问题?
更新 2
我创建了一个叉子并向其中添加了我的功能,我还扩展了机器人示例以便您明白我的意思。
看起来这段代码来自 UIView-Autolayout。最新版本的库有一个新方法可以让你停止将间距添加到边缘:
-(NSArray*)spaceViews:(NSArray*)views
onAxis:(UILayoutConstraintAxis)axis
withSpacing:(CGFloat)spacing
alignmentOptions:(NSLayoutFormatOptions)options
flexibleFirstItem:(BOOL)flexibleFirstItem
applySpacingToEdges:(BOOL)spaceEdges;
只需调用此方法并将 NO
传递给最后一个参数。
我延长了jrturton's UIView-Autolayout (based on this answer) and created a pull request.
现在可以通过调用新函数无边距地均匀分布视图:
-(NSArray*)spaceViews:(NSArray *)views
onAxis:(UILayoutConstraintAxis)axis
withMargin:(BOOL)margin
并将边距参数设置为NO
。
您已经可以找到该版本的 UIView-Autolayout here。
牙齿等距视图的全新机器人: