当父 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

我不知道那是不是你想要的测量值,但它应该(可能)至少改变一些东西。

添加子视图时,应为其设置约束以使其与容器视图大小相同,而不是设置其框架。如果这样做,它会在容器视图的边界发生变化时自动调整。