UIView addSubview自动布局不起作用

问题描述:

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

+0

您需要重新添加约束。当您删除子视图时,该视图的任何约束都会丢失。 – rdelmar 2014-10-31 04:24:49

你需要照顾一些点,而添加从自动布局中删除视图。

有在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 

当你创建的约束将其分配给变量

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

当你想从上海华删除它删除限制

[self.viewConstraintTop autoRemove]; 

删除您的看法,并再次同时增加分配约束为

self.viewConstraintTop = [Your Constraint]; 

问题是副视点不继承原始视图的尺寸/帧,并在那里补充说,如果它被卡在任何+任意大小的600×600的视图。我的解决方案是设置原始视图的框架,然后让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