具有自动布局的多行UILabels

时间:2014-08-14 23:20:55

标签: ios uitableview autolayout nslayoutconstraint

过去两天我一直试图让UITableViewCell进行以下手动计算。

CGFloat availableWidthForValueLabel = availableWidth * 0.7f;
CGSize valueLabelFitSize = [_valueLabel sizeThatFits:CGSizeMake(availableWidthForValueLabel, MAXFLOAT)];
_valueLabel.frame = CGRectMake(availableWidth - valueLabelFitSize.width, 0, valueLabelFitSize.width, valueLabelFitSize.height);

CGFloat availableWidthForKeyLabel = availableWidth - CGRectGetWidth(_valueLabel.frame);
CGSize keyLabelFitSize = [_keyLabel sizeThatFits:CGSizeMake(availableWidthForKeyLabel, MAXFLOAT)];
CGFloat keyLabelX = CGRectGetMinX(_valueLabel.frame) - keyLabelFitSize.width;

我在视图中有两个多行标签(键,值)。

该值锚定在视图的右侧,Key以固定的右对齐文本锚定在视图的左侧。

我想首先评估宽度/高度值,最大宽度为0.7 *视图宽度,然后希望该键占用视图中剩余的可用空间。

这适用于单行标签,但不适用于多行标签。

我已尝试在单元格中的updateConstraints和layoutSubview中设置值标签的preferredMaxLayoutWidth,但似乎发生的情况是单元格的高度增长不正确,因此单元格中出现大的间隙。

- (void)updateConstraints
{
    [super updateConstraints];

    // value width
    CGFloat width = ceil(self.keyValueSection.bounds.size.width * kValueMaxLenghtOfParentView);
    if (self.valueLabel.preferredMaxLayoutWidth != width )
    {
        self.valueLabel.preferredMaxLayoutWidth = width;
    }

    // dec width
    if (!self.decSection.hidden)
    {
        width = ceil(self.holderSection.bounds.size.width * kDecMaxLengthOfParentView);
        if (self.decLabel.preferredMaxLayoutWidth != width )
        {
            self.decLabel.preferredMaxLayoutWidth = width;
        }
    }

    // key width
    width = floor(self.keyValueSection.bounds.size.width - kKeyValueGap - self.valueLabel.bounds.size.width);

    if(self.keyLabel.preferredMaxLayoutWidth != width)
    {
        self.keyLabel.preferredMaxLayoutWidth = width;
    }
}

我已经尝试了我能在网上找到的所有内容,而且一切都近乎可行。我试过设置拥抱和压缩比但是。

1 个答案:

答案 0 :(得分:0)

虽然这可能不是最优雅的解决方案,但我喜欢做我想做的事情。

我使用Autolayout来定位标签,使用垂直间距> = 0顶部和底部以及中心Y对齐的约束。然后我具体说明标签之间的前导和尾随的约束。

然后我给每个标签一个高度和宽度约束,并使用sizeTofit方法来训练常量应该是什么,并在设置标签文本/引用文本属性时更新它们。

self.keyLabel.text = model.lineKey;
if ([model.lineValue isKindOfClass:[NSString class]]) {
    self.valueLabel.text = model.lineValue;
}
else if ([model.lineValue isKindOfClass:[NSAttributedString class]])
{
    self.valueLabel.attributedText = model.lineValue;
}
else
{
    self.valueLabel.text = nil;
    self.valueLabel.attributedText = nil;
}

self.keyValueGap.constant = kKeyValueGap;
CGFloat availableWidth = CGRectGetWidth(self.keyValueSection.bounds);

CGFloat availableWidthForValueLabel = availableWidth * 0.5f;
CGSize valueLabelFitSize = [self.valueLabel sizeThatFits:CGSizeMake(availableWidthForValueLabel, MAXFLOAT)];

self.valueHeight.constant = valueLabelFitSize.height;
self.valueWidth.constant = valueLabelFitSize.width;

CGFloat availableWidthForkeyLabel = availableWidth - valueLabelFitSize.width - kKeyValueGap;


CGSize keyLabelFitSize = [self.keyLabel sizeThatFits:CGSizeMake(availableWidthForkeyLabel, MAXFLOAT)];

self.keyHeight.constant = keyLabelFitSize.height;
self.keyWidth.constant = availableWidthForkeyLabel;

如果其他人有更好的想法:) - 我很乐意听到他们,因为我不喜欢在使用自动布局时手动计算