【问题标题】:iOS + Autolayout: UITableViewCell label + textfield width with rotationiOS + 自动布局:UITableViewCell 标签 + 带旋转的文本字段宽度
【发布时间】:2013-07-11 20:25:07
【问题描述】:

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

那么有人对我如何解决这个问题有任何建议吗?

【问题讨论】:

  • this answer。这有点复杂,但想法是一样的:每当视图加载或旋转时,约束都会根据方向发生变化。
  • 谢谢,这确实有效:)

标签: iphone ios objective-c autolayout


【解决方案1】:

在上面的 cmets 的帮助下,我在我的自定义 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-05
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 2015-08-30
    相关资源
    最近更新 更多