我以编程方式添加视图并更改高度约束的常量,但它没有将宽度设置为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中以编程方式设置约束的最佳方法。
感谢。
答案 0 :(得分:0)
我建议您覆盖viewWillLayoutSubviews
和viewDidLayoutSubviews
。在viewDidLoad
中,你应该只从xib向你的视图添加元素,对于框架的任何操作都应该在视图中进行,并进行布局子视图。它必须对视图循环做一些事情。
当视图控制器视图的边界发生变化时,视图 调整其子视图的位置,然后系统调用它 方法
在此事件中,您将获得有关屏幕和距离的正确情况,以便您可以相应地更新约束和框架。
答案 1 :(得分:0)
您可以随时更改约束常量。但正如我所理解的那样,您试图设置常量等于view
宽度值,取自view
的{{1}}或frame
属性。您需要知道,在bounds
中,由于您使用autolayout,因此此属性没有实际值;他们将在viewDidLoad
方法中获得实际值(请注意,它可以被多次调用)。当您将延迟添加0.2秒时,自动布局过程已经完成,这就是您获得正确结果的原因。因此,您可以在viewDidLayoutSubviews
中指定约束常量,或者更好地为相等宽度添加新约束:
viewDidLayoutSubviews
答案 2 :(得分:-1)
不要在viewDidLoad
中设置约束。而是将其设置为viewDidAppear
或viewDidLayoutSubviews
。这样您的应用程序就会加载所有组件以应用约束。