代码之家  ›  专栏  ›  技术社区  ›  Martin Lockett

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

  •  0
  • Martin Lockett  · 技术社区  · 9 年前

    我有一个带有容器视图的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 回复  |  直到 9 年前
        1
  •  3
  •   rdelmar    9 年前

    添加子视图时,应为其设置约束,使其大小与容器视图相同,而不是设置其框架。如果这样做,那么当容器视图的边界更改时,它将自动调整。

        2
  •  2
  •   Ian MacDonald    9 年前

    序言 那个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
    

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