tableView.tableHeaderView 已设置但未绘制

Posted

技术标签:

【中文标题】tableView.tableHeaderView 已设置但未绘制【英文标题】:tableView.tableHeaderView being set but not drawn 【发布时间】:2010-08-06 15:54:16 【问题描述】:

每当我设置我的 tableHeaderView 时,我都没有在模拟器中看到它。 如果我将它添加为子视图,它最终会被绘制在节标题下方。知道我在这里缺少什么吗?

我确实有一个 XIB 文件。我在 IB 中没有看到任何影响 headerViews 的属性。

- (void)viewDidLoad    
[super viewDidLoad];
MyTitleView *titleView = [[MyTitleView alloc] initWithFrame:CGRectMake(60,0,260,40)];
titleView.label.text = @"My Title";
self.navigationItem.titleView = titleView;
[titleView release];

StandardTableHeaderView *headerView = [[StandardTableHeaderView alloc] initWithFrame:CGRectMake(0,0,320,44)];
self.tableView.tableHeaderView = headerView;
//  [self.view addSubview:self.tableView.tableHeaderView];
//  [headerView release];


NSLog(@"Header: %@",self.tableView.tableHeaderView); //Logs ] Header:     <StandardTableHeaderView: 0x5a508b0; frame = (0 0; 320 44); layer = <CALayer: 0x5a51130>>

编辑: StandardTableHeaderView.m 初始化方法:

- (id)initWithFrame:(CGRect)frame 
if ((self = [super initWithFrame:frame])) 
    self.backgroundColor = [UIColor redColor];
    self.label = [[UILabel alloc] initWithFrame:CGRectMake(frame.origin.x,0,frame.size.width,frame.size.height)];
    self.label.backgroundColor = [UIColor clearColor];
    self.label.textColor = [UIColor whiteColor];
    self.label.font = [UIFont fontWithName:@"Helvetica" size:16];
    [self addSubview:self.label];

return self;

【问题讨论】:

【参考方案1】:

注意!如果您希望表格视图为您设置标题视图的框架,那您就错了,会得到非常奇怪的结果。

我将我的设置为CGRectZero,以为它会自行解决,但它不会出现,当它出现时,它会出现在导航栏下方或插入第一个单元格等。

【讨论】:

【参考方案2】:

首先你的代码看起来不错。

2 个可能的问题:

self.tableView 未设置 tableHeaderViewviewDidLoad 之后被覆盖

【讨论】:

我的 tableView 已设置 -- 单元格运行正常,日志显示 tableHeaderView 框架正常。我没有在其他任何地方更改 tableHeaderView.. 可能有些奇怪,应该复制到一个新项目中? 现在我将尝试调整 tableview 的大小并将 Header View 添加为单独的视图.. 您如何检查 tableView 属性是否已设置(不是 nil)?绘制单元格的事实并不一定说明 tableView 属性不为零...尝试在 self.tableView.tableHeaderView = headerView; 之后添加 NSLog(@"self.tableView = %@, self.tableView.tableHeaderView = %@", self.tableView, self.tableView.tableHeaderView); viewDidLoad 并查看您在日志中得到的内容... 就我而言,我得到了:self.tableView = ; contentOffset: 0, 0>, self.tableView.tableHeaderView = > 但仍未显示 @Farini,也许表格视图标题已设置但未绘制。这是我回答中的第二种情况。尝试在设置标题视图后立即调用[self.tableView reloadData];...【参考方案3】:

我遇到了同样的问题,并注意到如果我通过调用初始化表视图,我在 NIB 中定义的任何 tableViewHeader 都不会出现:

- (id)initWithStyle:(UITableViewStyle)style

但是当我使用以下方法初始化我的 tableview 时,它毫不费力地神奇地出现了:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

很奇怪。

【讨论】:

当您使用 initWithNibName: 时,您的所有 NIB 信息(如 tableHeaderView)将从您指定的 NIB 加载。这可能就是它“神奇地出现”的原因:)【参考方案4】:

我尝试将tableHeaderView 的设置放在ViewDidLoadloadView 方法中 - 它不起作用:视图的一部分是白色的,完全不可见。然后我试着把它放到ViewDidAppear 并且它起作用了:

- (void)viewDidAppear:(BOOL)animated

  [super viewDidAppear:animated];

  [self setupTableHeaderView];

【讨论】:

这对我也有用...但是为什么呢?我有其他 Xcode 项目,我在viewDidLoad 中设置了表头视图,一切正常......嗯。无论如何,谢谢:)【参考方案5】:

我在 viewDidLoad() 中遇到了同样的问题,它在 iPhone 11 Pro 的模拟器中工作,但不适用于 iPhone 8。将其移至 viewDidAppear() 解决了问题,但我最终将其移至 viewDidLayoutSubviews(),我认为这是最适合它的地方 - 在所有 iPhone 型号的模拟器中都能完美运行。

override func viewDidLayoutSubviews() 

    let headerView = Bundle.main.loadNibNamed("HeaderView", owner: self, options: nil)?.first as? UIView
    headerView!.frame = CGRect(x: 0, y: 0, width: table_view!.frame.width, height: 160.0)
    tableView!.tableHeaderView = headerView

【讨论】:

【参考方案6】:

我遇到了一个问题,我将一个视图作为标题放在 tableviewcontroller 中,当我运行应用程序时它不会显示,问题是我在没有原型单元格时添加了标题。如果您添加至少一个原型单元格,然后在其上方添加标题,然后删除该单元格(如果需要),它将正确注册为标题视图

【讨论】:

【参考方案7】:

当您在情节提要的 UITableView 中进行 UIView 并尝试设置 tableView.tableHeaderView = YOUR_VIEW 时,它将不起作用。您必须首先将该视图拖放到视图控制器之外创建其插座,然后设置

tableView.tableHeaderView = YOUR_VIEW

【讨论】:

【参考方案8】:

根据 Kalle 的关键线索,我添加了这个

open var intrinsicContentheight: CGFloat

    achievementLabel.sizeToFit()
    let labelSize = achievementLabel.bounds.size
    return labelSize.height + 13 + .verticalMargin

对定义标题视图的类感到厌恶。 如果你没有动态类型,你会有一个更简单的方法。

这是视图控制器中设置 tableheaderview 的用法 用这个类的实例

loanApplicationStepsView.bounds.size.height = loanApplicationStepsView.intrinsicContentheight

正如 Kalle 所说,仅仅因为没有 func tableViewHeightForHeader(_ tableView: UITableView) -> uitableviewdelegate 中的 CGFloat 并不意味着你不必为了计算它而跳舞

宽度由uikit自动设置

【讨论】:

【参考方案9】:

尝试在您的标题中设置 UITableViewDelegate 并将以下代码放入您的 .m 文件中。

#pragma mark UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section  
    return 44.0f;


- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
    StandardTableHeaderView *headerView = [[StandardTableHeaderView alloc] initWithFrame:CGRectMake(0,0,320,44)];

    return headerView;

【讨论】:

以上是关于tableView.tableHeaderView 已设置但未绘制的主要内容,如果未能解决你的问题,请参考以下文章

tableView.tableHeaderView 已设置但未绘制

tableView.tableHeaderView赋值后立即刷新

如何调整一个UITableView的tableHeaderView

在 0,0,320,45 中从 tableview 修复表头?

IOS:隐藏/重新加载 tableView 标头

隐藏导航栏后面的 tableHeaderView