UILabel定位

UILabel positioning

我将在一个视图中水平放置并居中放置多个 UILabel。根据用户的选择,将有 3、5 或 7 个标签。

我想让标签在每种情况下都居中。

示例:

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

L1 在每种情况下都是相同的,依此类推,只是根据需要显示或隐藏其他的。每条线代表一个独特的案例。

尝试为每个标签使用约束似乎是一项艰巨的任务。有更好的方法吗???

试用 iOS 9

上可用的新 UIStackView

我经常这样做。假设您的标签已经添加到您的视图中。

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;
}

我建议使用约束。这样您就不必担心不同的屏幕尺寸 & landscape/portrait.

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

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

根据您想要实现的目标。我想你可以像下面这样设置约束:

  • 让他们拥有相同的height/width
  • 使它们彼此对齐中心 y
  • 设置任意标签的y坐标
  • 设置每两个相邻标签之间的水平距离

当你想显示L1 L2 L3时,只需要隐藏其余标签,并将L2的中心x对齐到superview。同样的,当你想显示L1 L2 L3 L4 L5时,只需要对齐L3的中心x,隐藏其余的labels

更改约束后,您可以调用 -layoutIfNeeded() 立即更新约束(或将其放置在动画块中以动画转换)。