动态确定UITableViewHeaderView的高度

时间:2015-01-20 01:18:33

标签: ios objective-c uitableview

我遇到了为UITableView设置tableHeaderView的问题。我想将detailsView设置为tableHeaderView。此详细信息视图的高度会略有不同,并且在视图加载时不会立即知道。 detailsView还有自己的子视图,它们有自己的自动布局约束。所有自动布局都以编程方式完成。让我发布一些示例代码:

 - (void)viewDidLoad
    {
      [super viewDidLoad];

      [self.view addSubview:self.tableView];

      self.tableView.tableHeaderView = self.detailsView;

      }

    - (void)viewWillAppear:(BOOL)animated
    {
      [super viewWillAppear:animated];

      [self loadDetails];

    }

    -(void)loadDetails
    {
      //Omitted but does the following:
      //1. Makes a call to the api to get details 
      //2. Once received sets the details to the detailsView
      //3. Details could vary which influences detailView height size.
    }

    - (DetailsView *)detailsView
    {
      if(!_detailsView)
      {
        __weak DetailedViewController *_self = self;

        _detailsView = [DetailsView new];

        _detailsView.backgroundColor = [UIColor greenColor];

        _detailsView.translatesAutoresizingMaskIntoConstraints = NO;

    }

    return _detailsView;

    }

-(void)updateViewConstraints
{

  NSDictionary *views = @{
                          @"table"      : self.tableView,
                          };

  //Comment Detail View
  [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[table]-0-|" options:0 metrics:0 views:views]];
  [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[table]-0-|" options:0 metrics:0 views:views]];


}

这种方法的问题是tableHeaderView被推到顶部,这意味着我无法正确地滚动它。我不确定为什么会这样。我作为测试所做的是用UIImageView替换detailsView,如下所示。

-(UIImageView *)testImageView
{
    if(!_testImageView)
    {

        NSString *filePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"blackImage"] ofType:@"jpg"];
        UIImage *image = [UIImage imageWithContentsOfFile:filePath];

        _testImageView = [[UIImageView alloc]initWithImage:image];

        _testImageView.translatesAutoresizingMaskIntoConstraints = NO;
    }

    return _testImageView;
}

- (void)viewDidLoad
{
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.

   [self.view addSubview:self.tableView];
    self.tableView.tableHeaderView = self.testImageView;
}

在不知道图像的高度或任何尺寸的情况下,此代码可以精确地生成我需要的内容。

enter image description here     作为照片的证据,标题视图是完全可见和可滚动的,我不需要知道任何大小的图像,这是为了工作。我想用UIView而不是用于tableHeaderView的UIImageView来实现相同的功能。

重要提示: 详细信息视图不会添加为子视图 详细信息视图没有垂直高度约束或计算的任何约束 详细信息视图子视图具有以编程方式计算的约束

我研究过的事情 我已经查看了instrinsicSize,sizeThatFits,以及允许UIView填充父容器视图(tableHeaderView)的任何内容。我尝试了各种各样的组合但没有成功。

如果有人有解决方案来解决这个问题,我会非常感激!

(请告诉我,如果这个代码不足以传达问题的背景,我会发布更多内容。)

1 个答案:

答案 0 :(得分:0)

使用

systemLayoutSizeFittingSize:UILayoutFittingCompressedSize

0)一般地初始化你的标题,确保约束命中了headerView框架的所有四个边。

1)使用

设置标题视图的框架
systemLayoutSizeFittingSize:UILayoutFittingCompressedSize

2)将标题视图分配给tableview的框架

例如:

self.headerView = [[YourCustomHeaderView alloc] initWithYourCustomObject:obj];
self.headerView.frame = CGRectMake(0,0, SCREEN_WIDTH, [self.headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height);
self.tableView.tableHeaderView = self.headerView;