tableView.tableHeaderView正在设置但未绘制

时间:2010-08-06 15:54:16

标签: iphone xcode uitableview

每当我设置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 init方法:

- (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;
}

9 个答案:

答案 0 :(得分:7)

首先,您的代码看起来很好。

2个可能的问题:

  • self.tableView未设置
  • tableHeaderView 之后,
  • viewDidLoad被覆盖

答案 1 :(得分:6)

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

- (id)initWithStyle:(UITableViewStyle)style

但是当我使用:

初始化我的tableview时,它毫不费力地出现了
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

怪异。

答案 2 :(得分:6)

请注意!如果您希望表格视图为您设置标题视图的框架,那么您会误解并会得到非常奇怪的结果。

我让我设置为CGRectZero认为它自己解决了,但事情不会出现,当它出现时,它会隐藏在导航栏下面或者插入第一个细胞等。

答案 3 :(得分:2)

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

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

  [self setupTableHeaderView];
}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

当您在故事板中的UITableView内部进行UIView并尝试设置tableView.tableHeaderView = YOUR_VIEW时,它将无法正常工作。您必须首先将视图拖放到视图控制器外部创建其插座,然后设置

tableView.tableHeaderView = YOUR_VIEW

答案 6 :(得分:0)

只是遇到了我在viewDidLoad()中遇到的相同问题,它在iPhone 11 Pro的模拟器中有效,但不适用于iPhone8。将其移至viewDidAppear()解决了该问题,但最终我将其移至<我认为这是最合适的strong> 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
}

答案 7 :(得分:0)

根据 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自动设置

答案 8 :(得分:-7)

尝试在标题中设置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;
}