在没有边距的视图中均匀分布

时间:2015-03-11 10:01:10

标签: ios iphone uiview autolayout

我使用以下函数在视图中使用动态数量的视图(使用自动布局):

-(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)];

现在机器人看起来像这样:

enter image description here

请注意,在左臂处,视图不均匀分布,顶部和底部的边距要高得多。我可以水平地再现相同的行为并且使用更少的项目。

我已成功删除了边距,方法是将外部视图与超视图的边对齐,并将其余部分对齐。但是现在,由于这个问题,我总是在外部视图和它们旁边的视图之间有更大的空间,在其余部分之间。

有谁知道如何纠正这个问题?

更新2

我创建了一个fork并添加了我的函数,我还扩展了机器人示例,以便您可以看到我的意思。

take a look

2 个答案:

答案 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

全新的机器人,牙齿间距均匀分布: Robot