代码之家  ›  专栏  ›  技术社区  ›  avenged

使用动态大小的子视图调整UIView子类的大小

  •  4
  • avenged  · 技术社区  · 14 年前

    我目前有一个UIView子类,作为UITableViewController的头视图。根据为特定项检索的数据,所有子视图的大小都有所不同。

    在确定每个标签的大小之前,将调用UIView的layoutSubViews。这会导致一个问题,因为我在layoutSubViews方法中设置了视图的大小。因为它在我设置标签之前被调用,所以视图高度总是0。即使在设置了标签之后,我也调用setNeedsLayout,但是表视图的标题大小不会改变。

        TableHeaderView *tableHeaderView = [[TableHeaderView alloc] initWithFrame:CGRectZero];
        tableHeaderView.headerTitle.text = title;
        tableHeaderView.headerOption1.text = headerOption1
        tableHeaderView.headerOption2.text = headerOption2
        tableHeaderView.headerOption3.text = headerOption3
    
        [[self tableView] setTableHeaderView:tableHeaderView];
    
        [tableHeaderView setNeedsLayout];
        [tableHeaderView release];
    

    这是我的UIView子类

    - (id)initWithFrame:(CGRect)frame {
        if ((self = [super initWithFrame:frame])) {
    
         UIView *headerView = self;
    
         self.headerTitle = [[UILabel alloc] initWithFrame:CGRectZero];
         self.headerTitle.numberOfLines = 3;
         self.headerTitle.lineBreakMode = UILineBreakModeWordWrap;
         [headerView addSubview:self.headerTitle];
         [self.headerTitle release];
    
         self.headerOption1 = [[UILabel alloc] initWithFrame:CGRectZero];
         self.headerOption1.numberOfLines = 2;
         self.headerOption1.lineBreakMode = UILineBreakModeWordWrap;
         [headerView addSubview:self.headerOption1];
         [self.headerOption1 release];
     }
     return self;
    }
    
    - (void)layoutSubviews {
    
     [super layoutSubviews];
    
     CGSize maxLabelSize;
    
     /*...*/
    
     [self.headerTitle setFrame:CGRectMake(10.0f, 10.0f, titleWidth, titleHeight)];
    
     /*...*/
    
     [self.headerOption1 setFrame:CGRectMake(10.0f, (self.headerTitle.frame.origin.y + self.headerTitle.bounds.size.height + 2.5f), pubWidth, pubHeight)];
    
        /*...*/
        [self setFrame:CGRectMake(0.0f, 0.0f, 320.0f, tableHeaderHeight)];
    }
    

    第二次调用layoutSubViews时,除了视图本身(tableHeaderHeight具有正确的高度),所有子视图的大小都正确。我不应该从这个方法调整视图的大小吗?有更好的办法吗?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Kris Markel    14 年前

    你可能需要重写 sizeThatFits: 在您的UIView子类上返回基于您的布局的适当大小。

    TableHeaderView *tableHeaderView = [[TableHeaderView alloc] initWithFrame:CGRectZero];
    tableHeaderView.headerTitle.text = title;
    tableHeaderView.headerOption1.text = headerOption1
    tableHeaderView.headerOption2.text = headerOption2
    tableHeaderView.headerOption3.text = headerOption3
    
    tableHeaderView.frame = (CGRect){
        .origin = tableHeaderView.frame.origin,
        .size = [tableHeaderView sizeThatFits:CGSizeZero],
    };
    
    [[self tableView] setTableHeaderView:tableHeaderView];
    
    [tableHeaderView setNeedsLayout]; // I don't think you need this anymore.
    [tableHeaderView release];
    
        2
  •  1
  •   avenged    14 年前

    如果我换了

    [tableHeaderView setNeedsLayout];
    

    具有

    [tableHeaderView layoutSubviews];
    

    标题视图大小正确。发生这种情况是因为setNeedsLayout在视图设置为头视图之前不会调用layoutSubViews。但是,如果我直接调用layoutSubViews,则在设置视图之前将调用layoutSubViews。