我有一个带有两个标签和一个小图像的tableview单元。
如果标签文本很短,则所有内容都适合这样的一行:

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

但是,如果标签文本变长,图像
第二个标签应移至第二行:
.________________________________________.
|                                        |
|  [firstveryverylonglabel]            > |
|   [img] [secondverylonglabel]          |
|________________________________________|

我将如何使用自动排版?

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

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

如果需要两行,单元格的高度当然应该增加。

如果在Interface Builder中可以设置必要的约束,则可以获得加分,但是如果没有,那么我可以在tableview单元的init例程中使用代码设置它们。

我的应用程序应在iOS 7及更高版本下运行-无需iOS6。因此,我必须在tableview:heightForCellAtIndexPath:中计算高度,并将使用隐藏的单元格让Autolayout在此处进行处理。

最佳答案

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

-tableView:heightForRowAtIndexPath:中,我首先让Autolayout第一次通过静态隐藏的单元格(仅用于测量)来通过调用layoutIfNeeded来设置contentView,然后通过依次调用setNeedsUpdateConstraintsupdateConstraintsIfNeeded来强制其更新约束,最后测量高度带有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]];

然后,在给定固定水平起始位置的情况下,在视图上调用systemLayoutSizeFittingSize:UILayoutFittingCompressedSize并将宽度与contentView内部的最大可能空间进行比较。如果太宽,我需要设置两行约束集:
  [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]];

在单元格的updateConstraints方法中,我只是在视图上调用setNeedsUpdateConstraints,以确保在单元格的大小更改后(例如,旋转portrait landscape时)重新计算视图。
就是这样。

关于ios - iOS自动版式:标签文本变长时如何移动 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24147316/

10-12 15:08
查看更多