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
未设置
tableHeaderView
在 viewDidLoad
之后被覆盖
【讨论】:
我的 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 = [self.tableView reloadData];
...【参考方案3】:
我遇到了同样的问题,并注意到如果我通过调用初始化表视图,我在 NIB 中定义的任何 tableViewHeader 都不会出现:
- (id)initWithStyle:(UITableViewStyle)style
但是当我使用以下方法初始化我的 tableview 时,它毫不费力地神奇地出现了:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
很奇怪。
【讨论】:
当您使用 initWithNibName: 时,您的所有 NIB 信息(如 tableHeaderView)将从您指定的 NIB 加载。这可能就是它“神奇地出现”的原因:)【参考方案4】:我尝试将tableHeaderView
的设置放在ViewDidLoad
和loadView
方法中 - 它不起作用:视图的一部分是白色的,完全不可见。然后我试着把它放到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