I created a UIView programatically and add NSLayoutConstraint to it and it works and then add it as a subView of view controller's view. Right now I need to remove this view from superview and some time later add it again. But the layout won't work any more if I add it again using self.view addSubview
. How to make the layout works again?
问题:
回答1:
You need to take care of some points while adding and removing views from auto layout.
There are two methods available in UIView.h
class
// Allows you to perform layout before the drawing cycle happens.
// -layoutIfNeeded forces layout early
- (void)setNeedsLayout;
- (void)layoutIfNeeded;
Use these methods as per your requirement. So i suggest when ever you remove subview from view, Update constraint of superior view if it is required. And then call below method to reflect layout changes.
[self.view layoutIfNeeded];
Most cases above method will solve all layout related issues. However some time if complex structure is there i mean runtime changing behaviour of views.
Then override below method in your UIViewController
, Perform all frame related changes in this method.
- (void)viewDidLayoutSubviews
回答2:
The problem is the sub view does not inherit the original view's size/frame, and there for adds the view as if it was stuck in the Any+Any size of 600x600. My solution, is to set the frame of the original view, and then let iOS do the remainder of the work.
[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
回答3:
When you create constraints assign it to variables
@property (nonatomic, strong)NSLayoutConstraint *viewConstraintTop;
self.viewConstraintTop = [Your Constraint];
When you want to remove it from the superview remove the constraints
[self.viewConstraintTop autoRemove];
Remove your view and again while adding assign the constraint as
self.viewConstraintTop = [Your Constraint];