2016-07-20 48 views
0

我正在使用Storyboardautolayout。在我的ViewController中,我有一個基本結構:一個UIScrollView和一個包含不同標籤的contentView(UIView)。然後,我有我的類的viewDidAppear方法添加我的contentView裏面,然後以重新計算不同元素的幀尺寸我這樣做:UIView幀未在視圖中更新DIDAppear

- (void)fixContentViewHeight 
{ 
    _contentView.frame = CGRectMake(_contentView.frame.origin.x, _contentView.frame.origin.y, _contentView.frame.size.width, operators.frame.origin.y + operators.frame.size.height); 
    //constraint for contentView height 
    _contentViewHeight.constant = operators.frame.origin.y + operators.frame.size.height; 
} 

- (void)fixScrollViewHeight 
{ 
    _scrollView.frame = _contentView.frame; 
    _scrollView.contentSize = _contentView.frame.size; 
} 

其中operatorscontentView最後放置的元素,它總是在框架的底部。我將這兩種方法稱爲viewDidAppear,它們使視圖可滾動,問題在於contentView的框架沒有更新,因此最後一個元素始終是不可點擊的(因爲它們放置在視圖框架之外)。

我在做什麼錯?爲什麼scrollView變得可滾動,但contentView保持它的舊框架?

+0

你使用自動佈局嗎? – Miknash

+0

@NickCatib是的我正在使用自動佈局 – Signo

回答

3

如果您有影響_contentView高度的自動佈局約束,您將無法通過設置框架來更改其高度,因爲約束將覆蓋該高度。

您將需要(也應該)在你的代碼添加新/修改的約束,當你添加新的元素。然後打電話

_contentView.layoutIfNeeded() 

經過所有的更新,讓UI更新,如果它需要,它應該。

+0

我試過在我的contentView中使用高度約束,我像上面的代碼中那樣更新它: '_contentViewHeight.constant = operators.frame.origin.y + operators .frame.size.height;' 我的assing值是正確的,但高度根本不變。如果我調用'[_contentView layoutIfNeeded]''scrollView'變得不可滾動 – Signo

+1

@Signo 1.您不能設置框架高度和高度限制。這些是相互矛盾的。 2.您應該嘗試讓自動佈局爲您完成所有這些工作,而不是手動計算高度,請使用自動佈局爲您計算,對所有項目使用頂部/底部約束。 3.當您使用'layoutIfNeeded'時,_contentView是否正確展開? 4.從內容視圖到滾動視圖頂部以及從底部到底部是否存在限制? 5.您是否嘗試在兩個視圖上調用'layoutIfNeeded'? –

+1

我懂了!在閱讀第4點後,我再次檢查了我在IB中的約束條件,並且有兩個相互衝突的約束條件。我從清理'contentView'的限制,現在它的正常工作,根據所提供的信息謝謝:) – Signo

1

請更新UI在主隊列

dispatch_async(dispatch_get_main_queue(), ^{ 
      // update any UI on Main queue 
     }); 
+0

,這是沒有什麼幫助,OP已經聲明瞭滾動正在更新,所以這顯然是好的。 OP也沒有提到任何後臺任務。 –

1

我認爲,所有的幀相關的信息應該是內部viewWillLayoutSubviews()viewDidLayoutSubviews()。您可以在viewDidLoad()中添加內容,但對於任何幀管理,我都會使用上述方法。

在您的具體情況使用前,viewDidLayoutSubviews()。但是,您可以使用@Simon McLoughlin提到的與代碼連接的約束來解決這類問題。 'scrollView變得不可滾動'意味着你也應該更新contentSize,所以請注意這一點。

0

嘗試添加滾動視圖和你的最後放置元素之間的垂直空間的限制。