当前位置: 首页 > 知识库问答 >
问题:

iOS自动布局:当标签文本变长时如何移动视图

倪子晋
2023-03-14

我有一个带有两个标签和一个小图像的表视图单元格。如果标签文本很短,则所有文本都放在一行中,如下所示:

.________________________________________.
|                                        |
|  [firstlabel] [img] [secondlabel]    > |
|________________________________________|

但是,如果标签文本越来越长,图像和第二个标签应该移动到第二行:

.________________________________________.
|                                        |
|  [firstveryverylonglabel]            > |
|   [img] [secondverylonglabel]          |
|________________________________________|

我该如何使用自动布局来做到这一点?

第一个标签很简单 - 只需为左侧和顶部添加约束即可。标签始终只有一行,如果文本太长,标签会在中间被截断。

图像必须始终水平位于第二个标签(默认空间)的前面,并且两个标签都垂直居中。图像大小应与标签的动态文本字体大小(preferredFontForTextStyle: UIFontTextStyleBody)一起缩放,这样如果用户选择大文本,图像也会被绘制得更大。

如果需要两条线,细胞高度当然应该增长。

如果可以在Interface Builder中设置必要的约束,则可以获得加分,如果不能,则可以在tableview单元格的init例程中使用代码设置它们。

我的应用程序应该在iOS 7及更高版本下运行 - 不需要iOS 6。因此,我必须计算表视图:高度中的高度,并使用隐藏的单元格让自动布局在那里发挥其魔力。

共有1个答案

东门彬
2023-03-14

最后,我在代码中设置了约束。我将标签和图像嵌入到另一个视图中,然后为单元格和视图实现-updateConstraints

-tableView:heightForRowAtIndexPath:中,我首先让Autolayout通过调用layoutIfNeeded来设置contentView,然后通过调用setNeedsUpdateConstraints,然后调用updateConstraint IfNeed,强制它更新约束,最后使用systemLayoutSizeFittingSize:UILayoutFittingCompressedSize测量单元格高度。

在我的视图的updateConstraints方法中,我首先尝试将单元格与

  [self removeConstraints];
  [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:
        @"V:|-margin-[first]-margin-|"
    options:0 metrics:metrics views:views]];
  [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:
        @"H:|-margin-[first]-[image]-[second]-margin-|"
    options:NSLayoutFormatAlignAllCenterY metrics:metrics views:views]];

然后我在视图上调用systemLayoutSizeFitting Size: UILayoutFitting CompressedSize,并将宽度与内容视图内的最大可能空间进行比较,给定其固定的水平起始位置。如果太宽,我需要设置一个两行约束集:

  [self removeConstraints];
  [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:
        @"V:|-margin-[first]-[second]-margin-|"
    options:0 metrics:metrics views:views]];
  [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:
        @"H:|-margin-[first]-margin-|"
    options:0 metrics:metrics views:views]];
  [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:
        @"H:|-margin-[image]-[second]-margin-|"
    options:NSLayoutFormatAlignAllCenterY metrics:metrics views:views]];

在单元格的updateConstraint方法中,我只是在视图上调用setNeedsUpdateConstraint以确保在单元格大小更改后重新计算视图(例如,旋转纵向时)

 类似资料:
  • 下面的问题是这个问题的延续: iOS:自动布局中的多行 UI标签 主要思想是,每个视图都应该声明其“首选”(固有)大小,以便AutoLayout可以知道如何正确显示它。UILabel只是视图本身无法知道显示所需的大小的情况的一个例子。这取决于提供的宽度。 正如mwhuss所指出的,setPreferredMaxLayoutWidth实现了使标签跨越多行的技巧。但这不是这里的主要问题。问题是,我在何

  • 我已经在IB中设计了我的自定义单元,将其子类化,并将我的插座连接到我的自定义类。我在单元格内容中有三个子视图,它们是:UIView(cdView)和两个标签(titleLabel和emailLabel)。根据每行可用的数据,有时我希望在单元格中显示UIView和两个标签,有时只显示两个标签。我想做的是这样设置约束,如果我将UIView属性设置为hidden,或者将其从superview中删除,则两

  • 本文向大家介绍iOS 来自未知文本长度的动态标签框架,包括了iOS 来自未知文本长度的动态标签框架的使用技巧和注意事项,需要的朋友参考一下 示例 有时,我们必须根据未知文本长度的动态内容来调整UILabel的大小。在此示例中,UILabel的宽度固定为280个点,而高度则是无限的,比方说为9999。根据文本样式和maximumLabelSize估算框架。 目标C 迅速            

  • 我想在其中一个视图隐藏时制作可调整大小的视图。下面的链接已经针对iOS提出了这个问题。我想为Android制作。感谢任何帮助。我想在将可见性设置为隐藏计数和折扣后,为三个TextViev:position、stat_name、price添加空闲空间 我在这里的风格是:

  • 我有一个自定义视图CustomLayout(蓝色,自定义UIView),该视图包含3个子视图,通过使用约束(布局锚定)垂直对齐,每个视图按照以下顺序对齐: 1视图:幻灯片(红色,自定义UIView) 我想,当我单击按钮(黄色)时,如果使用动画打开,SlideLayout(红色)的高度大小会增加,如果关闭,则会减少。和其他视图必须在动画期间更改位置,如果SlideLayout增加/减少,则父视图(C

  • 我有一个自定义布局,如下所示。它有三个标签。 标签2是可选的。它并不存在于每个细胞中。因此,我想隐藏它,并将标签1向下移动一点,以便在发生这种情况时与标签3居中对齐。 以下是我为每个标签添加的约束。 标签1 标签 2 标签3 请注意,我添加了一个额外的约束,将中心与Y对齐,值为0的标签为1,并将其优先级设置为750。我想,如果我去掉标签2,优先级较低的约束将取代它的位置并下移。 但它似乎不起作用。