我使用以下函数在视图中使用动态数量的视图(使用自动布局):
-(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)
问题是它有利润。如何更改此方法以便在没有边距的情况下均匀分隔视图?
更新
似乎该方法毕竟不能正常工作,外部项目的边距远高于其余部分。
作为示例,我将左臂的代码更改为:
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)];
现在机器人看起来像这样:
请注意,在左臂处,视图不均匀分布,顶部和底部的边距要高得多。我可以水平地再现相同的行为并且使用更少的项目。
我已成功删除了边距,方法是将外部视图与超视图的边对齐,并将其余部分对齐。但是现在,由于这个问题,我总是在外部视图和它们旁边的视图之间有更大的空间,在其余部分之间。
有谁知道如何纠正这个问题?
更新2
我创建了一个fork并添加了我的函数,我还扩展了机器人示例,以便您可以看到我的意思。
答案 0 :(得分:2)
看起来这段代码来自UIView-Autolayout。该库的最新版本有一个新方法,可以阻止空格添加到边缘:
-(NSArray*)spaceViews:(NSArray*)views
onAxis:(UILayoutConstraintAxis)axis
withSpacing:(CGFloat)spacing
alignmentOptions:(NSLayoutFormatOptions)options
flexibleFirstItem:(BOOL)flexibleFirstItem
applySpacingToEdges:(BOOL)spaceEdges;
只需调用此方法并将NO
传递给最后一个参数。
答案 1 :(得分:0)
我已展开jrturton's UIView-Autolayout(基于this answer)并创建了pull request。
现在可以通过调用新函数来均匀分布视图而无需边距:
-(NSArray*)spaceViews:(NSArray *)views
onAxis:(UILayoutConstraintAxis)axis
withMargin:(BOOL)margin
并将margin参数设置为NO
。
您已经可以找到该版本的UIView-Autolayout here。
全新的机器人,牙齿间距均匀分布: