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”也感觉不是要走的路. 那么有人有任何建议我如何解决这个问题?
最佳答案 在上面的评论的帮助下,我已将以下内容添加到我的自定义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)