动态heightForHeaderInSection

时间:2012-03-05 09:30:50

标签: header height uitableview

如何根据我添加的视图修改标题部分的高度?
heightForHeaderInSection之前调用viewForHeaderInSection,在创建之前我不知道视图大小。

4 个答案:

答案 0 :(得分:12)

你可以这样说:

  1. 为headerView创建一个属性(NSArray,如果有多个标题视图)。
  2. 在“heightForHeaderInSection”中创建视图。
  3. 将您的视图分配给属性。
  4. 以“heightForHeaderInSection”返回视图的高度。
  5. 在“viewForHeaderInSection”中返回此属性。

答案 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)

这也有效:

  1. 覆盖estimatedHeightForHeaderInSection,返回CGFloat,无论如何,但不是0。

  2. 创建CGFloat属性以保存标题视图的高度。

    var sectionHeaderViewHeight:CGFloat = 10.0 
    

    (该值并不重要,但从未设置为0.0,如果您这样做,viewForHeaderInSection将永远不会被调用,您将永远不会有节标题视图!)

    < / LI>
  3. 覆盖heightForHeaderInSection并返回该属性。

    override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return sectionHeaderViewHeight
    }
    
  4. viewForHeaderInSection

    中创建标题视图
    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
         let headerView = UIView()
         //configuration your view
         //.....
    
         return headerView
    }
    
  5. 这是 关键步骤 :在返回headerView之前添加这些代码。

    self.tableView.beginUpdates()
    sectionHeaderViewHeight = //The value you would like to set
    self.tableView.endUpdates()
    
  6. 看起来像这样:

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