I have a UIViewController with a container view and I'm using auto layout. I have programmatically added another view controller as a child and added its view as a subview and set the view frame to the same as the container view. Everything is fine and when I animate a change to the container view, it adjusts correctly. How do I get the view of the child view controller to resize?
The child view controller is actually a navigation controller (called current_controller) created programmatically and has a root view controller which uses auto layout. Here is the method I'm using (it's in Ruby as I'm using RubyMotion but you'll get the idea). I have tried adding the three lines below to the completion block but they don't have any effect.
def shortcuts_hidden (hide)
NSLog("setting shortcuts hidden to #{hide}")
shortcuts_constraint.constant = hide ? shortcuts_view.frame.size.height : 0
UIView.animateWithDuration(
0.25,
animations: lambda {
self.view.layoutIfNeeded
},
completion: lambda { |completed|
current_controller.view.frame.size.height = container_view.frame.size.height
current_controller.view.layoutIfNeeded
current_controller.viewControllers[0].view.layoutIfNeeded
}
)
end
Update with "solution":
def configure_constraints_for_view(controller_view)
[NSLayoutAttributeLeft, NSLayoutAttributeRight, NSLayoutAttributeTop, NSLayoutAttributeBottom].each do |attribute_name|
self.view.addConstraint(
NSLayoutConstraint.constraintWithItem(
controller_view,
attribute: attribute_name,
relatedBy: NSLayoutRelationEqual,
toItem: container_view,
attribute: attribute_name,
multiplier: 1.0,
constant: 0
)
)
end
end
and
def select_view_controller(index)
if current_controller
current_controller.removeFromParentViewController
current_controller.view.removeFromSuperview
end
controller = view_controllers[index].build_menu_item
controller.selected_from_menu = true
@current_controller = UINavigationController.alloc.initWithRootViewController(controller)
self.addChildViewController(current_controller)
self.view.addSubview(current_controller.view)
current_controller.view.translatesAutoresizingMaskIntoConstraints = false
configure_constraints_for_view(current_controller.view)
current_controller.didMoveToParentViewController(self)
end