如何将自动布局约束添加到 tableview headerView 内的多行 UILabel?
Posted
技术标签:
【中文标题】如何将自动布局约束添加到 tableview headerView 内的多行 UILabel?【英文标题】:How to add autolayout constraints to a multi-line UILabel inside tableview headerView? 【发布时间】:2017-01-18 02:52:01 【问题描述】:我整天都在寻找解决这个问题的方法。我试图让我的 UILabel 根据tableViewHeaderView
中的文本长度自动调整大小。通常,在 UIView 中使用我的 UILabel 时,我会为 UILabel 设置顶部、前导和尾随约束,它会像我想要的那样工作。但是,我无法在tableViewHeaderView
中使用它。我能够设置顶部和前导约束,但我的尾随约束似乎不起作用。文字超出了屏幕的宽度。
将preferredMaxLayoutWidth
属性设置为数字可以解决问题,但我不想硬编码。
如果我错了,请纠正我,但是设置前导和尾随约束应该能够给我视图的宽度,不是吗?然后我可以使用该值设置preferredMaxLayoutWidth
。但该值是 2403,比屏幕宽度长得多。
还有其他人经历过这种情况吗?
#import "CustomTableViewHeader.h"
@implementation ReplyHeader
UILabel *questionLabel;
questionLabel = [[UILabel alloc]init];
questionLabel.text = @"SAMPLE TEXT: I had a question about how I can be a better human being using your method. I belive it is an integral part of what it means to be a human so I want to learn more if you are able give more details about it. I also found that what you said about the dogs out there is very cool and would love to learn more about that.";
questionLabel.font = [UIFont fontWithName:@"AvenirNext-Regular" size:17];
questionLabel.lineBreakMode = NSLineBreakByWordWrapping;
questionLabel.numberOfLines = 0;
questionLabel.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:questionLabel];
约束
[self addConstraint:[NSLayoutConstraint constraintWithItem:questionLabel attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeading multiplier:1.0f constant:5.0f]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:questionLabel attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:-5.0f]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:questionLabel attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0f constant:10]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:questionLabel attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0f constant:-10]];
更新视图
- (void)viewDidLayoutSubviews
questionLabel.preferredMaxLayoutWidth = questionLabel.frame.size.width;
[self layoutIfNeeded];
【问题讨论】:
您是否在awakeFromNib
中添加questionLabel
?你在哪里添加约束?你对UITableView
有什么限制?
【参考方案1】:
UITableView 不能与 AutoLayout 相处。页眉和页脚都继承了这个问题。 您可能已经知道,UITableViews 是精美的 UIScrollViews。如果您曾经尝试过使用滚动视图、大量元素和 AutoLayout,您一定知道它不能很好地工作。它滞后。这就是 UITableView 重用单元格的原因。它提高了性能,而且他们不使用 AutoLayout。
你应该尝试类似的东西
// with this you will get the most compressed size for your view if the constraints properly define it's size
CGFloat height = [footer systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
footer = CGRectMake(CGRectGetMinX(view.frame), CGRectGetMinY(footer.frame), CGRectGetWidth(footer.bounds), height);
// This will tell the layout engine to ignore the view and not try to resize it
view.autoresizingMask = UIViewAutoresizingNone;
self.tableView.tableFooterView = footer;
【讨论】:
以上是关于如何将自动布局约束添加到 tableview headerView 内的多行 UILabel?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用自动布局(约束)将子视图添加到 UIPageViewController?
TextView的自动高度,在tableView的单元格中使用autolayout