【问题标题】:UILabel positioningUIL标签定位
【发布时间】:2015-06-22 15:43:32
【问题描述】:

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

我希望在每种情况下都保持标签居中。

例子:

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

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

尝试为每个标签使用约束似乎是一项艰巨的工作。有没有更好的方法来做到这一点???

【问题讨论】:

  • 这必须适用于 ios7

标签: ios uiviewcontroller autolayout


【解决方案1】:

我建议使用约束。这样您就不必担心不同的屏幕尺寸和横向/纵向。

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

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

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

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

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

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

【讨论】:

  • 好吧..在玩了更多之后,这对我来说很有意义。约束对我来说有点挑战。如何根据需要以编程方式在不同的标签上设置中心约束?
  • 说,在你的viewDidLoad 中,你可以使用 NSLayoutConstraint* c = [NSLayoutConstraint constraintWithItem:self.label1 attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier 创建一个新的约束: 1个常数:0]; .创建并存储它们后,您可以删除它们,并在运行时添加它们。使用 -addConstraints:(NSArray*)constraints 和 -removeConstraint:(NSLayoutConstraint*)constraint
  • 谢谢你,吉安……效果很好。一个需要理解的问题...我通过情节提要在标签上设置了中心对齐约束,然后与 .h 文件建立了出口连接。我可以在运行时删除该约束,但我无法使用 -addcontraint 方法将其添加回来。这是错误:***由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效参数不满足:[constraint isKindOfClass:[NSLayoutConstraint class]]”***首先抛出调用堆栈:只是好奇为什么没有不行。
  • 如果从 Storyboard 中拖动,默认为弱指针。当它不再在其他地方被引用时,它就会被释放。也许删除定义中的弱项(或在objetive-c中将其显式更改为强项)会有所帮助。
【解决方案2】:

试试 iOS 9 上的新 UIStackView

【讨论】:

  • 谢谢,但需要ios7
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2012-05-04
    • 2012-03-12
    • 2012-11-08
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    相关资源
    最近更新 更多