当父UIViewController调整容器视图的大小时,子视图控制器不会自动布局

时间:2015-01-30 16:57:45

标签: ios uiviewcontroller uikit rubymotion

我有一个带容器视图的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

2 个答案:

答案 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

我不知道这是否是您想要的测量值,但它应该(可能)至少改变一些。