2010-10-20 127 views
3

我目前有一個UIView子類,充當我的UITableViewController的標題視圖。所有子視圖的大小取決於爲特定項目檢索的數據。使用動態大小的子視圖調整UIView子類的大小

在我可以確定每個標籤的大小之前,layoutSubViews正在調用UIView。這會導致問題,因爲我在layoutSubViews方法中設置了視圖的大小。由於它在設置我的標籤之前被調用,所以視圖高度始終爲0.即使設置了標籤,我仍然調用setNeedsLayout,但表視圖標題大小不會改變。

這將創建我的TableHeaderView併爲我的標籤設置文本。

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具有正確的高度)。我不應該從這個方法調整視圖的大小嗎?有沒有更好的方法呢?

回答

3

您可能需要在您的UIView子類上覆蓋sizeThatFits:以基於您的佈局返回適當的大小。

使用方法如下:

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]; 
+0

我試過你的建議,在設置標籤的內容後調用[tableHeaderView sizeToFit],但我認爲我真正的問題在於,一旦setTableHeaderView:tableHeaderView被調用,表頭的大小不會改變。 [tableHeaderView setNeedsLayout]不會調用layoutSubViews方法,直到將視圖設置爲標題之後。因此,無論我以什麼樣的大小設置視圖,它都不會影響標題的大小。 – avenged 2010-10-20 19:04:44

+1

我沒有說要調用它,你需要**在你的子類上實現** sizeThatFits並返回你想要的大小。 – 2010-10-20 19:39:19

+0

對不起,我首先想說的是我確實實現了sizeThatFits來返回標題視圖的正確大小。問題是,一旦sizeToFit被調用(我想你想讓我在設置標籤後調用它),tableHeaderView已經被設置爲表視圖標題。 – avenged 2010-10-20 19:45:12

1

如果我更換

[tableHeaderView setNeedsLayout]; 

[tableHeaderView layoutSubviews]; 

頭的看法是正確的大小。發生這種情況是因爲在視圖設置爲標題視圖之前,setNeedsLayout不會調用layoutSubViews。如果我直接調用layoutSubViews,那麼在設置視圖之前會調用layoutSubviews。

但我過去聽說直接調用layoutSubviews並不是一個好主意,對於這種情況也是如此嗎?

+0

在setNeedsLayout之後調用layoutIfNeeded。 – hybridcattt 2014-06-16 12:45:28

相關問題