Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 更新约束时委托_Ios_Iphone_Objective C_Xcode_Uiscrollview - Fatal编程技术网

Ios 更新约束时委托

Ios 更新约束时委托,ios,iphone,objective-c,xcode,uiscrollview,Ios,Iphone,Objective C,Xcode,Uiscrollview,在UIScrollView中使用情节提要自动布局时,我遇到了一个问题。我正在更新UIScrollView的约束,然后设置scrollview的内容大小。但是UIScrollView约束需要一点时间来更新,并且最初UIScrollView无法滚动,因为其高度比视图高。我无法更改当前的实现 是否有任何方法、通知或委托方法来检查约束是否已更新?这样我可以做进一步的改变 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *scrollView

在UIScrollView中使用情节提要自动布局时,我遇到了一个问题。我正在更新UIScrollView的约束,然后设置scrollview的内容大小。但是UIScrollView约束需要一点时间来更新,并且最初UIScrollView无法滚动,因为其高度比视图高。我无法更改当前的实现

是否有任何方法、通知或委托方法来检查约束是否已更新?这样我可以做进一步的改变

@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,您可以跳过第一步,使过程更快,因为在本例中,您已经知道不需要更新任何约束,只需要更改视图的帧。