iphone – iOS Autolayout:UITableViewCell标签文本字段宽度与旋转

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)

点赞