2014-07-17 42 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