我有一个带容器视图的UIViewController,我使用自动布局。我已经以编程方式将另一个视图控制器添加为子视图,并将其视图添加为子视图,并将视图框架设置为与容器视图相同。一切都很好,当我为容器视图的更改设置动画时,它会正确调整。如何获取子视图控制器的视图以调整大小?
子视图控制器实际上是以编程方式创建的导航控制器(称为current_controller),并且具有使用自动布局的根视图控制器。这是我使用的方法(它在Ruby中使用RubyMotion,但你会得到这个想法)。我尝试将下面的三行添加到完成块中,但它们没有任何效果。
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
更新"解决方案":
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
和
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
答案 0 :(得分:3)
添加子视图时,应该为其设置约束,使其与容器视图的大小相同,而不是设置其框架。如果这样做,那么它将在容器视图的边界发生变化时自动调整。
答案 1 :(得分:2)
序言:Ruby看起来很奇怪,但我对RubyMotion一无所知。在iOS中,您无法直接设置视图的高度,您必须一次设置其框架。我将假设RubyMotion只是抽象它并允许你做这样荒谬的事情。
看起来您正在修改current_controller.view
的框架,但您没有修改子视图控制器视图的框架。
current_controller.view.frame.size.height = container_view.frame.size.height
current_controller.view.layoutIfNeeded
current_controller.viewControllers[0].view.frame.size.height = container_view.frame.size.height
current_controller.viewControllers[0].view.layoutIfNeeded
我不知道这是否是您想要的测量值,但它应该(可能)至少改变一些。