当父 UIViewController 调整容器视图的大小时,子视图控制器不会自动布局
Child view controller does not auto layout when the parent UIViewController adjusts the size of the container view
我有一个带有容器视图的 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
更新 "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
和
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
序言:那个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
我不知道那是不是你想要的测量值,但它应该(可能)至少改变一些东西。
添加子视图时,应为其设置约束以使其与容器视图大小相同,而不是设置其框架。如果这样做,它会在容器视图的边界发生变化时自动调整。
我有一个带有容器视图的 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
更新 "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
和
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
序言:那个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
我不知道那是不是你想要的测量值,但它应该(可能)至少改变一些东西。
添加子视图时,应为其设置约束以使其与容器视图大小相同,而不是设置其框架。如果这样做,它会在容器视图的边界发生变化时自动调整。