2013-04-10 66 views
14

是否有任何简单的方法可以帮助我使用它们的内容大小动态地改变依赖视图的位置?UILabel sizeToFit和约束条件

我想在列中显示几个视图,它们都有不同的内容。而且我要他们放置了一个又一个(我已经创建了使用约束的布局,看起来像这样)

initial layout

但每当我更改标签的内容和呼叫sizeToFit,系统似乎忽略布局。

after size to fit call

目前我感兴趣的只是height属性,我知道约束矩形可太习惯,并在过去,我写了很多的UIView类动态改变大小(我想每个人都一样) 。但也许有一种我不知道的简单方法?

+0

检查此http://stackoverflow.com/a/16009707/988169。这工作得很好。 – pkc456 2015-05-25 07:46:30

回答

42

-sizeToFit如果您使用自动布局,则不应调用。这是“旧”系统的一部分。

它看起来像IB已经在您的约束中插入了明确的高度(标签旁边的垂直条表示这一点)。尝试选择标签并按Cmd + =清除这些。

对于多标签,你也需要做在您的视图控制器下面进行旋转/缩放视图时一切都正常工作:

- (void)updateLabelPreferredMaxLayoutWidthToCurrentWidth:(UILabel *)label 
{ 
    label.preferredMaxLayoutWidth = 
     [label alignmentRectForFrame:label.frame].size.width; 
} 

- (void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 

    [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label1]; 
    [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label2]; 
    [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label3]; 

    [self.view layoutSubviews]; 
} 

多行标签暴露自动布局的弱点之一。我们必须更新preferredMaxLayoutWidth以强制标签回流并调整其高度,否则如果视图被调整大小/旋转,自动布局不会实现标签需要重新排版和调整大小。

+0

谢谢!为我工作(我完全删除并创建了新的视图,xcode似乎隐式地存储了一些与布局相关的数据) – asdf 2013-04-10 15:28:43

+0

是的,IB + autolayout现在有很多问题。希望苹果能够在未来改进它。 – 2013-04-10 17:19:15

+1

你能解释一下你的代码吗,特别是使用'alignmentRectForFrame'。 – 2013-10-22 15:42:26

-1

这也适用。 https://github.com/jszumski/auto-layout-table-cells/blob/master/DynamicCellHeights/JSLabel.m

@interface JSLabel : UILabel 

@end 

@implementation JSLabel 

- (id)init { 
    self = [super init]; 

    // required to prevent Auto Layout from compressing the label (by 1 point usually) for certain constraint solutions 
    [self setContentCompressionResistancePriority:UILayoutPriorityRequired 
              forAxis:UILayoutConstraintAxisVertical]; 

    return self; 
} 

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    self.preferredMaxLayoutWidth = CGRectGetWidth(self.bounds); 

    [super layoutSubviews]; 
} 

@end 
2

如果你仍然想使用自动布局约束的标签。这是一个解决方案:

[self.lblBadgeValue sizeToFit]; 
self.constraintWidthBadgeLabel.constant = self.lblBadgeValue.frame.size.width; 
[self.lblBadgeValue needsUpdateConstraints]; 
[self.lblBadgeValue layoutIfNeeded]; 
  • 更多地解释:
  • sizeToFit - >使标签适合的高度,宽度与 内容吧。
  • 所以在运行时,你需要更新约束高度, 或宽度标签
  • 之后,你需要说的编译器知道 什么需要更新约束。
  • 如果在约束条件下有变化,最后您需要调用 布局。