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

我创建了一个叉子并向其中添加了我的功能,我还扩展了机器人示例以便您明白我的意思。

take a look.

看起来这段代码来自 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

牙齿等距视图的全新机器人: