2012-08-27 86 views
8

當我在我的某個觀點上致電sizeToFit時,我注意到iOS框架首先在該視圖上調用sizeThatFits,然後調用layoutSubviews。這對我來說是有問題的,因爲我的sizeThatFits中的計算取決於我的layoutSubviews的結果。在以下示例中,子視圖的調整值爲layoutSubviews,此子視圖的高度用於sizeThatFits。目前我的代碼不工作,順序顛倒。如何在sizeThatFits之前調用layoutSubviews?

在我的視圖控制器的viewDidLoad:

UIView* header = [[MyHeader alloc] init]; 
[header sizeToFit]; 
self.tableView.tableHeaderView = header; 
[header release]; 

筆者認爲:

- (void) layoutSubviews { 
    [super layoutSubviews]; 
    [self.subView sizeToFit]; 
} 

- (CGSize) sizeThatFits:(CGSize)size { 
    return CGSizeMake(
     self.frame.size.width, 
     self.subView.frame.size.height 
    ); 
} 
+0

你有沒有解決過這個問題? –

+0

在你的第一個代碼中,你調用'[header sizeToFit]'它什麼都不做,它不會覆蓋'MyHeader'的'sizeThatFits:'不被覆蓋: >這個方法的默認實現返回視圖邊界矩形的大小部分。 – Rivera

回答

0

你就不能更改子視圖的框架中-layoutSubviews方法而不是-sizeThatFits:方法?

1

您是否試過在視圖上致電layoutIfNeeded強制layoutSubviews?儘管誤導性的名字,這是立即觸發layoutSubviews的方式。請嘗試在sizeToFitsizeThatFits之前撥打此號碼。

6

你會希望你的觀點總是做正確的事(tm),無論你按照什麼順序調用東西。爲了達到這個目的,我建議把你的代碼用你的視圖和子視圖分別計算出你想要的高度。沿着這些路線的東西:

- (void)updateSubviewDimensions 
{ 
    [self.subview sizeToFit]; 
    // possibly much more code 
} 

- (void) layoutSubviews { 
    [super layoutSubviews]; 
    [self updateSubviewDimensions]; 
} 

- (CGSize) sizeThatFits:(CGSize)size { 
    [self updateSubviewDimensions]; 
    return CGSizeMake(
     self.frame.size.width, 
     self.subView.frame.size.height 
    ); 
} 

這樣,你不依賴於記住調用sizeToFit之前調用某個方法,但是你的看法將永遠做你想要什麼。此外,從現在開始幾個月後(或讓不同的開發人員查看它),您的代碼不易變得易於理解。

+0

TL; DR:實現'updateConstraints'並調用'updateSubviewDimensions'。詳細:我沒有時間獲得完整的答案,但我認爲這裏適當的解決方案是實施updateConstraints。從iOS 8進行測試。3,systemLayoutConstraintsFittingSize的默認UIView實現最終會調用updateConstraints。這給AL系統提供了確定尺寸所需的全部內容,而無需實際操作。 –

2

如果你的sizeThatFits:需要佈局是準確的,那麼你需要強制佈局(見下面的代碼)。但我認爲這是設計不佳,因爲你的佈局沒有考慮到「大小」。

- (CGSize) sizeThatFits:(CGSize)size { 

    [self setNeedsLayout]; 
    [self layoutIfNeeded]; 

    return CGSizeMake(
     self.frame.size.width, 
     self.subView.frame.size.height 
    ); 
} 

一個更好的辦法可能是使用自動佈局的子視圖,然後使用systemLayoutSizeFittingSize:來確定您的視圖所需要的大小(與sizeThatFits:

如果您不能或不想要使用自動佈局,那麼你應該考慮爲實際的佈局和佈局計算分開代碼路徑。

1

這裏的問題是子視圖直到layoutSubviews被調用之後纔會有維度。這與自定義表格視圖單元格中的相同。

爲了解決這個問題,你需要改變周圍的邏輯或者自己做數學來獲得一個明確的維度而不依賴於自動化的東西。

相關問題