【问题标题】:Why do I need a direct access to the view container instead of accessing it's view controller's view in order to animate?为什么我需要直接访问视图容器而不是访问它的视图控制器的视图来制作动画?
【发布时间】:2014-01-05 23:08:53
【问题描述】:
我设置了一个视图控制器,其中包含多个容器视图,每个视图控制器都有自己对应的视图控制器。在包含所有这些的视图控制器的代码中,我将嵌入/子视图控制器作为属性,我在prepareForSegue 中设置了它们,因为它们是嵌入的。
现在,如果我尝试访问其中一个子视图控制器的视图,例如 childViewController.view.frame 以移动它,当我尝试移动它时,它只是将它推到视图控制器内部一点点而不实际移动视图控制器本身。
但是,如果在 Storyboard 中,我为包含视图控制器的每个容器视图创建了一个出口,并使用 childView.frame,它可以很好地正确移动 FULL 视图控制器。
这是为什么?他们不是都引用同一个视图吗?
【问题讨论】:
标签:
ios
objective-c
uiview
uiviewcontroller
uistoryboard
【解决方案1】:
不,它们引用的不是同一个视图。 childView 只是一个普通的 UIView,它是容器控制器的子视图。 childViewController.view 是子视图控制器的视图——该视图是 childView 的子视图。因此,如果要移动子视图控制器的视图,则需要移动其父视图 childView(这两个视图具有相同的大小,因此您不能在 childView 中移动子视图控制器的视图而不会超出范围)。
您在 IB 中所做的,在代码中等同于 this(其中 childVC 是嵌入式视图控制器,containerView 是父视图中的子视图)。此代码将在容器控制器中。
[self addChildViewController: childVC];
[childVC didMoveToParentViewController:self];
childVC.view.frame = self.containerView.bounds;
[self.containerView addSubview:childVC.view];