Ios 更新约束时委托
在UIScrollView中使用情节提要自动布局时,我遇到了一个问题。我正在更新UIScrollView的约束,然后设置scrollview的内容大小。但是UIScrollView约束需要一点时间来更新,并且最初UIScrollView无法滚动,因为其高度比视图高。我无法更改当前的实现 是否有任何方法、通知或委托方法来检查约束是否已更新?这样我可以做进一步的改变Ios 更新约束时委托,ios,iphone,objective-c,xcode,uiscrollview,Ios,Iphone,Objective C,Xcode,Uiscrollview,在UIScrollView中使用情节提要自动布局时,我遇到了一个问题。我正在更新UIScrollView的约束,然后设置scrollview的内容大小。但是UIScrollView约束需要一点时间来更新,并且最初UIScrollView无法滚动,因为其高度比视图高。我无法更改当前的实现 是否有任何方法、通知或委托方法来检查约束是否已更新?这样我可以做进一步的改变 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *scrollView
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *scrollViewHieghtConstraint;
self.scrollViewHieghtConstraint.constant = 500;
[self.scrollView updateConstraints];
[self.scrollView setContentSize:CGSizeMake(0, 1000)];
您可以使用UIViewController
的-(void)updateViewConstraints
选择器
如果扩展了所述视图,还可以使用
-(void)updateConstraints
UIView的选择器。不能直接调用-updateConstraints。您必须将视图的约束标记为dirty,iOS将在下一个更新周期调用该方法
在UIViewController的实现中,当需要更改约束时添加以下内容:
self.scrollViewHieghtConstraint.constant = 500;
[self.view setNeedsLayout];
我假设UIScrollView是UIViewController视图的子视图。如果不是,则在scrollview的父视图上调用-setNeedsLayout
如果您需要知道子视图何时已经在正确的位置上,您有一个UIViewController回调,名为-viewDidLayoutSubviews谢谢,它可以工作:)我想补充的一点是。我们必须在此方法中调用[super updateViewConstraints],否则它将崩溃。从框架中调用的大多数方法都应该使用对super的调用。如果您必须处理
UIViews
,这一点非常重要,因为您从中扩展的类将对布局产生影响,这也是为什么如果不这样做,它会崩溃,因为NSConstraints
会不满意。是的,UIScrollView是UIViewController视图的子视图。-viewDidLayoutSubviews
回调通常在约束添加到UIViewController
视图之前调用。如果您使用的是基于约束的布局,并且希望根据UIViewController
约束更新子视图的约束,则应始终使用-updateViewConstraint
回调。很抱歉,这不正确-viewDidLayoutSubviews是在计算约束并且视图中的所有内容都已就位后调用的。是的,-updateViewConstraints用于更改约束,如果您希望对系统提供的内容进行更多控制,但它不是一个供您调用的方法。你必须将布局标记为脏的,系统会为你调用它。@galrito“使用”的意思当然是子类。您不应该对任何对象调用-updateConstraint
。另外,我认为,-setNeedsLayout
对于基于约束的布局来说是一个过度的杀伤力,您可以调用-setNeedsUpdateConstraints
@Cemal No,过度杀伤力是在您已经对约束进行更改时调用-setNeedsUpdateConstraints。通过这样做,您告诉iOS在不需要时重新计算所有约束。自动布局包括三个步骤:1。更新约束条件;2.布局;3.展示。通过调用-setNeedsLayout,您可以跳过第一步,使过程更快,因为在本例中,您已经知道不需要更新任何约束,只需要更改视图的帧。