我有一个带有两个标签和一个小图像的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,然后通过依次调用setNeedsUpdateConstraints
和updateConstraintsIfNeeded
来强制其更新约束,最后测量高度带有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/