2014-07-17 40 views
4

我在使用UIScrollView使用Storyboard自動佈局時遇到了一個問題。我正在更新一個UIScrollView的約束,並且比設置scrollview的內容大小之後。但是UIScrollView約束需要一點時間來更新,而最初的UIScrollView由於比視圖更高的高度而無法滾動。我無法改變當前的實施。約束更新時的委託

是否有任何方式,通知或任何委託方法來檢查約束是否更新?這樣我可以做進一步的改變。

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *scrollViewHieghtConstraint; 

self.scrollViewHieghtConstraint.constant = 500; 
[self.scrollView updateConstraints]; 

[self.scrollView setContentSize:CGSizeMake(0, 1000)]; 

回答

10

您可以使用- (void)updateViewConstraints選擇器UIViewController

如果您已擴展所述視圖,也可以使用- (void)updateConstraints選擇器UIView

+3

謝謝,它的工作原理:)有一兩件事我想補充的是。我們必須在這個方法中調用[super updateViewConstraints],否則它會崩潰。 – Kampai

+0

您從框架調用的大多數方法應該使用超級調用。如果你必須處理'UIViews',這很重要,因爲你擴展的類將會對佈局產生影響,這也是爲什麼如果你不這樣做會導致崩潰,因爲'NSConstraints'不會被滿足。 –

0

您不能直接調用-updateConstraints。您必須將視圖的約束標記爲髒,並且iOS將在下一個更新週期中調用該方法。

在一個UIViewController的實現,當你需要的約束來改變補充一點:

self.scrollViewHieghtConstraint.constant = 500; 
[self.view setNeedsLayout]; 

我假設的UIScrollView是UIViewController的視圖的子視圖。如果不是,則在scrollview的父視圖上調用-setNeedsLayout。

如果你需要知道當子視圖已經在他們的正確的地方,你有一個的UIViewController回調,被稱爲-viewDidLayoutSubviews

+0

是UIScrollView是UIViewController視圖的子視圖。 – Kampai

+0

'-viewDidLayoutSubviews'回調通常在約束添加到UIViewController的視圖之前調用。如果您使用的是基於約束的佈局,並且想根據UIViewController約束來更新子視圖的約束條件,則應該始終使用'-updateViewConstraint'回調。 –

+0

對不起,這是不正確的。 -viewDidLayoutSubviews是在計算約束條件之後調用的,並且所有內容都在視圖內部。是的,-updateViewConstraints用於更改約束條件,如果您想更多地控制系統爲您提供的功能,但不是您要調用的方法。您必須將佈局標記爲髒,系統會爲您調用它。 – galrito