iOS(6.x)上的AutoLayout存在问题,我不知道答案。
我有一个带UILabel和UITextField的UITableViewCell,如下所示:
+------------------+
| label textField |
+------------------+
我想使用AutoLayout来布局这些,但有一点需要注意。 UILabel在纵向模式下应为100点,在横向模式下应为175点。
即。在视觉格式语言中,这将类似于以下
Portrait:
|-[label(100)]-[textField]-|
Landscape:
|-[label(175)]-[textField]-|
因此,文本字段将占据单元格视图的其余部分。
当然我可以通过覆盖willRotateToInterfaceOrientation:duration:
来解决这个问题并找出当前显示的单元格,然后在它们上面调用updateConstraints
,这样我就可以根据方向更新标签的宽度,但是这似乎不是要走的路。首先,然后挂钩旋转动画似乎很难或不可能。其次,我的感觉告诉我,我可以用优先级和不平等来解决它。我会为标签添加类似[label(>=100,<=175)]
的内容,但之后我需要做其他事情,因为否则标签的大小将始终为特定大小(100或175)。
我以为我已经修复了它:我已经将标签的内容拥抱优先级设置为200,在文本字段上设置一个约束,宽度应该至少为152,然后它做我想要的,除非我举例说明启用表格视图的编辑模式,因为那时文本字段不再是152点宽(没有足够的空间)。输入这个任意的“152”也感觉不是要走的路。
所以有人有任何建议我如何解决这个问题吗?
答案 0 :(得分:2)
在上述评论的帮助下,我将以下内容添加到我的自定义UITableViewCell类中:
- (void)setupLabelWidthConstraint {
if (self.labelWidthConstraint) {
[self.contentView removeConstraint:self.labelWidthConstraint];
}
if (UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation])) {
self.labelWidthConstraint =
[[NSLayoutConstraint constraintsWithVisualFormat:@"[label(==width)]"
options:0
metrics:@{@"width": [NSNumber numberWithFloat:LABEL_LANDSCAPE_WIDTH]}
views:@{@"label": self.label}] lastObject];
} else {
self.labelWidthConstraint =
[[NSLayoutConstraint constraintsWithVisualFormat:@"[label(==width)]"
options:0
metrics:@{@"width": [NSNumber numberWithFloat:LABEL_PORTRAIT_WIDTH]}
views:@{@"label": self.label}] lastObject];
}
[self.contentView addConstraint:self.labelWidthConstraint];
}
在initWithCoder:
中运行它。此外,我已将以下内容添加到我的UITableViewController:
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
NSArray *visibleCells = [self.tableView visibleCells];
for (UITableViewCell *visibleCell in visibleCells) {
if ([visibleCell isKindOfClass:[FMSingleInputCell class]]) {
FMSingleInputCell *singleInputCell = (FMSingleInputCell *)visibleCell;
[singleInputCell setupLabelWidthConstraint];
}
}
}
这就是诀窍! (LABEL_LANDSCAPE_WIDTH
和LABEL_PORTRAIT_WIDTH
定义为100.f
和175.f
)