UIView addSubview自动布局无法正常工作

时间:2014-10-31 03:13:46

标签: ios uiview autolayout

我以编程方式创建了一个UIView并将NSLayoutConstraint添加到它并且它可以工作,然后将其添加为视图控制器视图的子视图。现在我需要从superview中删除此视图,稍后再添加一次。但是如果我使用self.view addSubview再次添加它,布局将不再起作用。如何使布局再次工作?

3 个答案:

答案 0 :(得分:16)

问题是子视图没有继承原始视图的大小/帧,并且用于添加视图,好像它被卡在Any + Any大小的600x600中。我的解决方案是设置原始视图的框架,然后让iOS完成剩下的工作。

[self.myOtherView setFrame:self.view.frame];   //Replace frame size with already resized view
[self.myOtherView setNeedsLayout];  //Tell iOS to autolayout the new sub view
[self.addSubView:self.myOtherView];  //Add it

答案 1 :(得分:3)

在自动布局中添加和删除视图时,您需要注意一些要点。

UIView.h

中有两种方法可用
// Allows you to perform layout before the drawing cycle happens. 
//   -layoutIfNeeded forces layout early
- (void)setNeedsLayout;
- (void)layoutIfNeeded;

根据您的要求使用这些方法。因此,我建议您何时从视图中删除子视图,如果需要,请更新上级视图的约束。然后调用下面的方法来反映布局变化。

[self.view layoutIfNeeded];

上述大多数情况下的方法将解决所有与布局相关的问题。但是,如果复杂结构存在,那么我的意思是运行时改变视图的行为。

然后在UIViewController中覆盖以下方法,在此方法中执行所有与帧相关的更改。

- (void)viewDidLayoutSubviews

答案 2 :(得分:0)

创建约束时,将其分配给变量

@property (nonatomic, strong)NSLayoutConstraint *viewConstraintTop;
self.viewConstraintTop = [Your Constraint];

如果要从超视图中删除它,请删除约束

[self.viewConstraintTop autoRemove];

在添加约束为

的同时删除视图
self.viewConstraintTop = [Your Constraint];