过去两天我一直试图让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;
}
}
我已经尝试了我能在网上找到的所有内容,而且一切都近乎可行。我试过设置拥抱和压缩比但是。
答案 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;
如果其他人有更好的想法:) - 我很乐意听到他们,因为我不喜欢在使用自动布局时手动计算