我遇到了为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;
}
在不知道图像的高度或任何尺寸的情况下,此代码可以精确地生成我需要的内容。
作为照片的证据,标题视图是完全可见和可滚动的,我不需要知道任何大小的图像,这是为了工作。我想用UIView而不是用于tableHeaderView的UIImageView来实现相同的功能。
重要提示: 详细信息视图不会添加为子视图 详细信息视图没有垂直高度约束或计算的任何约束 详细信息视图子视图具有以编程方式计算的约束
我研究过的事情 我已经查看了instrinsicSize,sizeThatFits,以及允许UIView填充父容器视图(tableHeaderView)的任何内容。我尝试了各种各样的组合但没有成功。
如果有人有解决方案来解决这个问题,我会非常感激!
(请告诉我,如果这个代码不足以传达问题的背景,我会发布更多内容。)
答案 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;