如何根据我添加的视图修改标题部分的高度?
在heightForHeaderInSection
之前调用viewForHeaderInSection
,在创建之前我不知道视图大小。
答案 0 :(得分:12)
你可以这样说:
heightForHeaderInSection
”中创建视图。heightForHeaderInSection
”返回视图的高度。答案 1 :(得分:3)
是的,您必须创建视图然后还将该视图的大小确定为完全独立的事件似乎很奇怪/多余,但您可以通过将某些共享逻辑移动到某个共享方法来最小化愚蠢。例如,您可能必须在创建过程中的某个时刻弄清楚视图的大小,因此将该逻辑移动到某个共享方法。
例如,我有逻辑用于确定我根据文本大小放入标题的UILabel的大小。所以我从我的viewForHeaderInSection
中取出它并将其移到我自己的方法sizeForHeaderLabelInSection
中,我用它来确定标签控件的大小):
- (CGSize)tableView:(UITableView *)tableView sizeForHeaderLabelInSection:(NSInteger)section
{
NSString *text = [self tableView:tableView titleForHeaderInSection:section];
CGSize constraint = CGSizeMake(self.view.frame.size.width - kSectionTitleLeftMargin - kSectionTitleRightMargin, kMaxSectionTitleHeight);
return [text sizeWithFont:[self fontForSectionHeader] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
}
然后,我修改了标准heightForHeaderInSection
以使用该方法,当然,在我的UILabel周围添加了我的顶部和底部边距:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return [self tableView:tableView sizeForHeaderLabelInSection:section].height + kSectionTitleTopMargin + kSectionTitleBottomMargin;
}
然后我修改了标准viewForHeaderInSection
也使用了这个sizeForHeaderLabelInSection
:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
CGSize size = [self tableView:tableView sizeForHeaderLabelInSection:section];
UIView* headerView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, size.width + kSectionTitleLeftMargin + kSectionTitleRightMargin, size.height + kSectionTitleTopMargin + kSectionTitleBottomMargin)];
//headerView.contentMode = UIViewContentModeScaleToFill;
// Add the label
UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(kSectionTitleLeftMargin,
kSectionTitleTopMargin,
size.width,
size.height)];
// put stuff to set up my headerLabel here...
[headerView addSubview:headerLabel];
// Return the headerView
return headerView;
}
显然,你如何做到这完全取决于你和你想要实现的目标。但是我认为如果你将你的思维方式从“我如何计算出我在viewForHeaderInSection
中创建的视图的大小”改为“如何移动我用来确定大小的代码”,你就会取得成功在viewForHeaderInSection
中我可以使用heightForSectionInHeader
可以使用的常用方法。
答案 2 :(得分:3)
这也有效:
覆盖estimatedHeightForHeaderInSection
,返回CGFloat
,无论如何,但不是0。
创建CGFloat
属性以保存标题视图的高度。
var sectionHeaderViewHeight:CGFloat = 10.0
(该值并不重要,但从未设置为0.0
,如果您这样做,viewForHeaderInSection
将永远不会被调用,您将永远不会有节标题视图!)
覆盖heightForHeaderInSection
并返回该属性。
override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return sectionHeaderViewHeight
}
在viewForHeaderInSection
override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let headerView = UIView()
//configuration your view
//.....
return headerView
}
这是 关键步骤 :在返回headerView
之前添加这些代码。
self.tableView.beginUpdates()
sectionHeaderViewHeight = //The value you would like to set
self.tableView.endUpdates()
override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let headerView = UIView()
//configuration your view
//.....
//----Key Steps:----
self.tableView.beginUpdates()
sectionHeaderViewHeight = //The value you would like to set
self.tableView.endUpdates()
//----Key Steps----
return headerView
}
var sectionHeaderViewHeight:CGFloat = 10.0
override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return sectionHeaderViewHeight
}
答案 3 :(得分:1)
要强制调用heightForHeaderInSection方法,您只需要调用UITableView的两个方法beginUpdates / endUpdates。
首先创建并初始化一个变量高度并将其返回
var height: CGFloat = 160.0
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return height
}
然后添加一个方法,用新值
更新截面高度func updateHeaderHeight(newHeight: CGFloat) {
tableView.beginUpdates()
height = newHeight
tableView.endUpdates()
}