UILabel定位

时间:2015-06-22 15:43:32

标签: ios uiviewcontroller autolayout

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

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

示例:

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

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

尝试对每个标签使用约束似乎是一项很重要的工作。有更好的方法吗???

3 个答案:

答案 0 :(得分:1)

我建议使用约束。因此,您无需担心不同的屏幕尺寸和尺寸。横向/纵向。

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

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

基于您想要实现的目标。我认为您可以设置如下约束:

  • 使它们具有相同的高度/宽度
  • 让它们彼此对齐
  • 设置任何标签的y坐标
  • 设置每两个相邻标签之间的水平距离

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

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

答案 1 :(得分:0)

尝试iOS 9上提供的新UIStackView

答案 2 :(得分: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;
}
相关问题