2014-07-08 54 views
2

隨着Xcode 6和iOS8我在我的應用程序中有奇怪的問題。問題出在我用xib文件製作的自定義UITableViewCell中。在iOS8模擬器上,layoutSubviews方法被調用無限次數。就像在「while(1)」中一樣,或者一次又一次地自我調用。 這是佈局子視圖方法:LayoutSubviews問題

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    UIEdgeInsets insets = UIEdgeInsetsMake(1, 1, 1, 1); 
    self.contentView.frame = UIEdgeInsetsInsetRect(UIEdgeInsetsInsetRect(self.bounds, insets), insets); 

    NSLog(@"Layout"); 
} 

當我刪除self.contentView.frame線,一切正常。另外,如果我使self.contentView.translatesAutoresizingMaskIntoConstraints = NO,遞歸停止,但它打破了我所有的約束。 這個問題只發生在iOS8中,同樣的方法在iOS6和iOS7中工作正常。

爲什麼我不能在此方法中更改self.contentView.frame?有關於它的新文檔嗎?

+0

你可以在更多信息?當你創建你的UITableViewCell時做。 –

回答

3

我在我的一個項目中看到了類似的行爲,這是我認爲正在發生的觀察結果。在iOS7中,如果您使用自動佈局,然後修改視圖的框架,layoutSubviews不會被調用。因此,您的框架更改將被應用並且一切正常。在iOS8中,使用UIView進行內部更改。現在每次更改框架layoutSubviews都會被調用。

所以,如果我們看看你的代碼,我認爲發生的是layoutSubviews被調用。您修改該框架,該框架再次觸發layoutSubviews。當調用[super layoutSubviews]時,它會重新應用您的原始約束,它會重置您之前進行的幀調整。然後再次更改框架,這會觸發另一個layoutSubviews。這無限重複。

可能的解決辦法:

不要修改框,修改的約束來代替。

您可以創建IBOutlets以約束並修改它們以獲取所需的新幀。這將使得當約束被重新應用時,它們是你所做的修改後的,並且不會發生無限循環。你爲什麼用這種方法設置插圖

When is layoutSubviews called?