2015-06-22 22 views
0

我将有几个UILabel水平放置并以视图为中心。根据用户的选择,将会有3个,5个或7个标签。UILabel定位

我想在每种情况下保持标签居中。

实施例:

 L1 L2 L3 
    L1 L2 L3 L4 L5 
    L1 L2 L3 L4 L5 L6 L7 

L1是在每种情况下相同,等等,只是示出或hidding其他需要。每条线代表一个独特的案例。

试图为每个标签使用约束似乎是一个很大的工作。有一个更好的方法吗???

+0

这必须可用于ios7 – SteveM

回答

1

我推荐使用约束。这样你就不用担心不同的屏幕尺寸&风景/人像。

您可以查看创建约束的可视格式。我觉得它非常好用: https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/VisualFormatLanguage/VisualFormatLanguage.html

我经常做的是创建不同的约束集,并将每个集合放在一个单独的数组中。当我需要进行交换时,我只删除整个集合并添加另一个集合。

根据你想要达到的目标。我想你可以设置的约束如下所示:

  • 使它们具有相同的高度/宽度
  • 使其对准芯Y相互
  • 设置任何标签的y坐标
  • 集每两个相邻标签之间的水平距离

当您想要显示L1 L2 L3时,只需隐藏其余标签,并将L2的中心x与超级视图对齐。同样,当您想要显示L1 L2 L3 L4 L5时,只需对齐L3的中心x并隐藏其余标签

更改约束条件后,您可以拨打-layoutIfNeeded()立即更新约束(或将其置于一个动画块来动画过渡)。

+0

好的......在玩了更多之后,这对我来说很有意义。限制对我来说是一个挑战。我需要如何在不同的标签上以编程方式设置中心约束? – SteveM

+0

在你的'viewDidLoad'中,你可以创建一个新的约束,使用方法如下:NSLayoutConstraint * c = [NSLayoutConstraint constraintWithItem:self.label1 attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0] ; 。在创建并存储它们之后,可以删除它们,并在运行时添加它们。使用-addConstraints:(NSArray *)约束和-removeConstraint:(NSLayoutConstraint *)约束 – gyan

+0

谢谢gyan ...那很好。一个需要理解的问题......我通过Storyboard设置了标签的中心对齐限制,然后与.h文件建立了连接。我可以在运行时删除该约束,但我无法使用-addcontraint方法将其添加回去。这是错误:***终止应用程序由于未捕获的异常'NSInternalInconsistencyException',原因:'无效的参数不令人满意:[约束isKindOfClass:[NSLayoutConstraint类]]' ***第一次抛出调用堆栈:只是好奇为什么没有工作。 – SteveM

0

尝试在iOS上使用可用的新UIStackView 9

+0

谢谢,但需要ios7 – SteveM

+1

UICollectionView? –

0

我通常会这样做。假设您的标签已被添加到您的视图。

NSArray *labels; 
UIView *yourBaseView; 

CGRect baseFrame = yourBaseView.bounds; 
CGFloat spacer = 10; 

CGRect labelFrame; 
labelFrame.origin = CGPointMake(baseFrame.origin.x + spacer, baseFrame.origin.y); 
labelFrame.size = CGSizeMake((baseFrame.size.width - (labels.count * spacer) - (spacer * 2))/labels.count, baseFrame.size.height); 

for (int i = 0; i < labels.count;++i){ 
    UILabel *label = labels[i]; 
    label.frame = labelFrame; 
    labelFrame.origin.x += labelFrame.size.width + spacer; 
} 
相关问题