【问题标题】:How to switch between multiple content views and view controllers using a single container view?如何使用单个容器视图在多个内容视图和视图控制器之间切换?
【发布时间】:2013-10-13 14:33:08
【问题描述】:

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

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

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

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

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

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 内容视图从最后一个视图到容器视图底部都有一个“大于或等于”约束,所以如果我的原始内容视图比我用 @ 实例化的内容视图更高或更短987654323@,_containerView 会保持原来的大小。

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

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

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

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

【问题讨论】:

    标签: ios uiviewcontroller


    【解决方案1】:

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

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

    它们在Implementing a Container View Controller部分有所描述

    【讨论】:

    • 文档还说不需要重写或调用这两个方法,但我会仔细看看。
    • 你确定吗? didMoveToParentViewController: 描述:If you are implementing your own container view controller, it must call the didMoveToParentViewController: method of the child view controller after the transition to the new controller is complete or, if there is no transition, immediately after calling the addChildViewController: method.
    【解决方案2】:

    我在非常相似的情况下所做的(带有两个可交换 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];
    

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

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

    【讨论】:

    • 可能是,除了我认为 UIPageViewController 中的页面都是相同的高度,而我的不同界面绝对不是。
    • 我可以强制视图调整大小以适应其内在内容大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2013-06-16
    • 2023-03-07
    相关资源
    最近更新 更多