iOS + Autolayout:UITableViewCell标签+带旋转的文本字段宽度

时间:2013-07-13 10:41:21

标签: iphone ios objective-c autolayout

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”也感觉不是要走的路。

所以有人有任何建议我如何解决这个问题吗?

1 个答案:

答案 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_WIDTHLABEL_PORTRAIT_WIDTH定义为100.f175.f