每当我设置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;
}
答案 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
的设置放在ViewDidLoad
和loadView
方法中 - 它不起作用:视图的一部分是白色的,不完全可见。然后我试着把它放到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;
}