0

如果这更像是一个最佳实践/您的意见想要的问题,我深表歉意,但我什至不确定这件事是否得到支持,过去几个小时在谷歌上几乎没有产生什么有用的见解。无论如何。

我有一个视图控制器,其中有一些控件需要保持不变,还有一些其他控件需要根据这些“固定”控件的状态进行更改。我认为这可能是视图容器的完美工作:我可以设计任意数量的具有不同控件和内容的不同视图控制器,然后我可以在它们之间切换,将它们放置在视图容器中。

所以我设置了整个东西,自动布局和所有附件,布局东西工作(这意味着我已经做了一些非正统的测试,确认如果我调整视图容器的大小,所有其他“固定”视图都会移动因此,我对此非常满意。

除了似乎没有办法直接从情节提要中同时嵌入多个视图控制器并让包含(外部、超级、其他)视图控制器执行适当的转场。好的,那么,让我们以编程方式进行,这就是我所知道的最好的地方。

我尝试了一些令人难以置信的愚蠢代码,例如

for(UIViewController *vc in [self childViewControllers]) {
    // I know, I'm just prototyping here...
    [vc.view removeFromSuperview];
    [vc removeFromParentViewController];
}
UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"B_Screen"];
[self addChildViewController:vc];
[_containerView addSubview:vc.view];

_containerView似乎没有适当调整大小。这可能是因为 che 内容视图从最后一个视图到容器视图底部都有一个“大于或等于”约束,所以如果我的原始内容视图比我实例化的内容视图更高或更短B_Screen,将_containerView保持原来的大小。

在这一点上,我什至会感谢 RTFM,只要您能指出正确的手册(是的,我已经阅读了“iOS 视图控制器编程指南”(尽管我可能遗漏了一些内容,所以请随意和他们打我的脸。

一旦一切正常,我想设置花哨的动画,比如淡出/淡入或类似的东西,但我想我可以自己做。

编辑:仔细检查后,似乎发生了两件事:内容视图被正确替换,但它并没有紧紧地“拥抱”它的内容,这意味着视图底部有一个相当大的空间,在它的底部和底部之间“最后”的观点。然而,这很明显,因为我在内容视图的底部和最后一个包含的视图的底部之间有一个约束,它是“大于或等于”类型,这意味着 20 是好的,15不好,但是 200 和 20 一样好。但是,如果我将它设置为更严格的东西,比如适当的“相等”,自动布局就会到处抱怨存在冲突的约束。这很可能是 AL 的“错误”(或功能,听起来像预期的行为)。

似乎发生的第二件事是容器视图底部与它下方属于“外部”容器的“第一个”视图之间的垂直间距约束被静默破坏(AL 在控制台中什么也没说就像它必须打破约束或类似的东西一样),这意味着容器视图只是覆盖了任何应该被向下移动的东西。我在滚动视图中,所以我并不关心我的界面有多高。

4

2 回答 2

0

只是猜测,但也许你缺少的是调用:

  • - (void)willMoveToParentViewController:(UIViewController *)parent
  • - (void)didMoveToParentViewController:(UIViewController *)parent

它们在实现容器视图控制器部分有所描述

于 2013-10-13T14:48:17.967 回答
0

我在非常相似的情况下所做的(具有两个可交换 UIViewControllers 的永久导航栏是使用UIPageViewController

将其存储为类似的属性

@property (nonatomic) UIPageViewController *pageController;

要防止通过滑动切换视图控制器,请使用 page curl 进行设置并禁用手势识别器

// Somewhere in view did load
UIViewController *initialSubVC = [[UIViewController alloc] ...];
self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];

// Set initial view controller
[self.pageController setViewControllers:@[initialSubVC] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

// Disable manual swiping
for (UIGestureRecognizer *recognizer in self.pageController.gestureRecognizers) {
    recognizer.enabled = NO;
}

要在视图控制器之间切换,您可以再次使用以下代码,可能由单击按钮触发

[self.pageController setViewControllers:@[otherSubVC] direction:0 animated:NO completion:nil];

也许您可以在视图中设置所有视图控制器并加载它们并将它们存储在一个数组中。

我不确定您是否必须设置委托并实现委托方法,因为没有滑动。

于 2013-10-14T17:12:27.773 回答