具有Autolayout的tableHeaderView无法正常工作

时间:2015-04-27 16:57:12

标签: ios objective-c uitableview nstableheaderview

大家好我有一个TableHeaderView,一切都由Autolayout管理:

  • 顶部的UIImageView应始终为2:1,因此我设置了Aspect配额和其余所需的约束。

  • 4 UIButtons应始终为水平,并且应具有相同的高度和宽度。所以我使用Equal Width和Equal Height,并且纵横比为1:1

  • 我有两个UILabelsnumberOfLines设为0.我还创建了UILabel的子类,因为preferredMaxLayoutWidth,如下所示:

    - (void) layoutSubviews
    {
    [super layoutSubviews];
    
    if ( self.numberOfLines == 0 )
    {
    if ( self.preferredMaxLayoutWidth != self.frame.size.width )
    {
        self.preferredMaxLayoutWidth = self.frame.size.width;
        [self setNeedsUpdateConstraints];
     }
     }
    }
    

这是我的代码:

- (void)initializeHeaderViewLabels
{
 //After the Response from my server arrived i set the tableHeaderView with the Textdata
self.tableView.tableHeaderView = nil;

if((self.contentDict[@"title"]) != [NSNull null])
{
    self.headerTitleLabel.text = (self.contentDict[@"title"]);
}

if((self.contentDict[@"shortDescription"]) != [NSNull null])
{
    self.headerDescriptionLabel.text = (self.contentDict[@"shortDescription"]);
}

[self.headerView setNeedsLayout];
[self.headerView layoutIfNeeded];

CGFloat height = [self.headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = height;
self.headerView.frame = headerFrame;

[self.tableView setTableHeaderView:self.headerView];

}

我从我的服务器获取UILabels的图像和文本,所以我必须等到响应到达,然后我打电话给initializeHeaderViewLabels

**我的问题是tableHeaderView在运行时太大了,所以我的UILabel被拉伸了,并且有很多whiteSpace。也许我想念一下?

5 个答案:

答案 0 :(得分:6)

为了使其正常工作,您需要一些魔法或从表标题视图迁移。我已经回答了类似的问题here。诀窍是通过autolayout评估它的高度后,神奇地重置tableHeaderView。我为此创建了示例项目:TableHeaderView+Autolayout

答案 1 :(得分:1)

尝试以下解决方案

- (void)sizeHeaderToFit
{
    UIView *header = self.tableView.tableHeaderView;

    [header setNeedsLayout];
    [header layoutIfNeeded];

    CGFloat height = [header systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    CGRect frame = header.frame;

    frame.size.height = height;
    header.frame = frame;

    self.tableView.tableHeaderView = header;
}

来源:

table header view height is wrong when using auto layout, IB, and font sizes

另请参阅以下问题......!

How do I set the height of tableHeaderView (UITableView) with autolayout?

答案 2 :(得分:0)

我的问题是我在我的标题视图上设置了约束,这些约束将一些帧值映射到超视图帧值。当我删除约束并直接设置框架时,一切正常。

答案 3 :(得分:-3)

标题视图高度在表视图委托中设置。默认情况下,它与界面构建器中的大小相同,在app中运行时它太大,因为界面构建器的宽度为600.

所以你需要的是在UITableViewDelegate

中实现这个方法
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 200.0 // Set the desired height based on your device or what ever you are using.
}

和Objective-C版本:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 200.0f;
}

答案 4 :(得分:-6)

blogpost.tags = new_tags