【发布时间】:2015-03-11 10:01:10
【问题描述】:
我使用以下函数在一个视图中分隔动态数量的视图(使用自动布局):
-(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 并向其中添加了我的功能,我还扩展了机器人示例,以便您了解我的意思。
【问题讨论】:
-
我知道那个代码 :D 我不确定你所说的边距注释是什么意思 - 你的意思是你想让边缘视图与超级视图的边缘对齐吗?
-
@jrturton 是的,其余视图均匀分布
-
尊敬的同事 James Frost 为您服务
标签: ios iphone uiview autolayout