为什么我需要在延迟一段时间后设置约束常量?

时间:2016-08-08 12:09:53

标签: ios objective-c nslayoutconstraint

我以编程方式添加视图并更改高度约束的常量,但它没有将宽度设置为viewDidLoad方法中的屏幕宽度。但是在0.2秒延迟队列之后放入那些线路时宽度完美设置。

以下是我的代码

在ViewDidLoad中添加

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ cAreaView = [[[NSBundle mainBundle] loadNibNamed:@"aView" owner:nil options:nil] objectAtIndex:0]; [_vwComplaintArea addSubview:cAreaView]; [self setConstraintLayout:cAreaView toVw:_vwComplaintArea]; [_firstViewHeightConstraint setConstant:_firstViewHeightConstraint.constant + cAreaView.bounds.size.height]; [_heightForComplaintARe setConstant:cAreaView.bounds.size.height]; });

-(void)setConstraintLayout:(UIView *)vw toVw:(UIView *)toVw { [vw autoSetDimensionsToSize:CGSizeMake(toVw.bounds.size.width, vw.bounds.size.height)]; [vw autoPinEdge:ALEdgeTop toEdge:ALEdgeTop ofView:toVw]; [vw autoPinEdge:ALEdgeLeft toEdge:ALEdgeLeft ofView:toVw]; }

任何人都可以建议在viewDidLoad中以编程方式设置约束的最佳方法。

感谢。

3 个答案:

答案 0 :(得分:0)

我建议您覆盖viewWillLayoutSubviewsviewDidLayoutSubviews。在viewDidLoad中,你应该只从xib向你的视图添加元素,对于框架的任何操作都应该在视图中进行,并进行布局子视图。它必须对视图循环做一些事情。

每份文件: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instm/UIViewController/viewDidLayoutSubviews

  

当视图控制器视图的边界发生变化时,视图   调整其子视图的位置,然后系统调用它   方法

在此事件中,您将获得有关屏幕和距离的正确情况,以便您可以相应地更新约束和框架。

答案 1 :(得分:0)

您可以随时更改约束常量。但正如我所理解的那样,您试图设置常量等于view宽度值,取自view的{​​{1}}或frame属性。您需要知道,在bounds中,由于您使用autolayout,因此此属性没有实际值;他们将在viewDidLoad方法中获得实际值(请注意,它可以被多次调用)。当您将延迟添加0.2秒时,自动布局过程已经完成,这就是您获得正确结果的原因。因此,您可以在viewDidLayoutSubviews中指定约束常量,或者更好地为相等宽度添加新约束:

viewDidLayoutSubviews

答案 2 :(得分:-1)

不要在viewDidLoad中设置约束。而是将其设置为viewDidAppearviewDidLayoutSubviews。这样您的应用程序就会加载所有组件以应用约束。