【问题标题】:Storyboarding multiple views to be displayed at different times故事板在不同时间显示多个视图
【发布时间】:2013-10-04 07:14:22
【问题描述】:

我有一个应用程序,它应该根据加速度计报告的值显示一组不同视图中的一个。我想在 Xcode 的 Storyboard Editor 中设置视图,née Interface Builder。此外,我想使用 Xcode 的新式自动布局工具。基本上,这些工具允许您定义对象间约束,并且运行时系统会计算出所述对象的去向。

这是我想要的一个简单示例,用伪代码:

if (accelerometer == toTheLeft) {
    [topLevelView showSubview:leftView];
} else if (accelerometer == toTheRight) {
    [topLevelView showSubview:rightView];
} else {
    [topLevelView showSubview:centerView];
}

我知道要执行虚构的showSubview: 方法,我实际上必须删除当前显示的所有错误视图,并添加我想要的视图,但这不是重点。

如前所述,我想使用 Storyboard Editor/Interace Builder 布置每个 UIView 对象(即 leftViewrightViewcenterView)。但是,当我这样做时,我最终会在 IB 中将不同的视图叠加在一起,令人困惑。我的视图控制器最终会在它的视图中添加和删除视图,但是通过这种方式设置自动布局非常困难。

这是我的问题,最后。 有没有更好的方法可以在 Storyboard 编辑器中为一个视图控制器直接排列许多通常重叠的视图,还是我只需以编程方式设置所有内容?


我的内省常见问题解答,供热心读者使用:

  1. 您为什么如此设置 Storyboard Editor/IB? 它可以自动找出视图定位和调整大小的许多痛苦部分。听起来不错!如果可以的话,我想让它为我工作。

  2. 之前一定有人问过这个问题,对吧? 呃,有点。 This question 在我找到的那些中最接近。然而,这个解决方案仍然需要我以编程方式设置框架,否定在我看来是使用 IB 的最佳理由——自动布局。 This one 也让我很兴奋,但实际上并不是一回事。

【问题讨论】:

    标签: ios uiview uiviewcontroller uistoryboard


    【解决方案1】:

    我正在处理的应用程序中遇到了类似的情况。我所做的是在我的主视图控制器中添加了两个容器视图(尽管听起来你只需要一个)。我删除了容器中的嵌入视图,并将它们作为 IBOutlets 添加到我的头文件中:

    @property (weak, nonatomic) IBOutlet UIView *topContainerView;
    @property (weak, nonatomic) IBOutlet UIView *bottomContainerView;
    

    然后我继续为我想使用的三个子视图中的每一个创建 UIViewControllers,然后我可以通过情节提要进行设计。

    在我的实现文件中,我还有两个属性,

    @interface WorkOrderContainerViewController ()
    @property UIViewController *topViewController;
    @property UIViewController *bottomViewController;
    @end
    

    为了在显示的视图控制器之间切换,我使用了以下方法(对于底部容器视图,我也有两个类似的方法):

    - (void)presentTopViewController:(UIViewController *)viewController
    {
        // Remove current top view controller.
        if (topViewController != nil) {
            [self removeTopViewController];
        }
    
        [self addChildViewController:viewController];
        [[viewController view] setFrame:[topContainerView bounds]];
        [topContainerView addSubview:[viewController view]];
        [self setTopViewController:viewController];
        [viewController didMoveToParentViewController:self];
    }
    
    - (void)removeTopViewController
    {
        [topViewController willMoveToParentViewController:nil];
        [[topViewController view] removeFromSuperview];
        [topViewController removeFromParentViewController];
    }
    

    然后我可以简单地实例化我的视图

    [self presentTopViewController:[storyboard instantiateViewControllerWithIdentifier:@"leftView"]];
    

    我知道您正在寻找一种管理重叠视图的方法,但将每个视图控制器都作为单独的视图控制器并以这种方式进行可能会更容易。

    【讨论】:

      【解决方案2】:

      您可以使用带有三个选项卡的选项卡视图控制器,然后隐藏选项卡栏。我认为这在技术和语义上都可以很好地映射到您的场景。

      【讨论】:

        猜你喜欢
        • 2011-12-01
        • 2023-03-14
        • 2012-04-21
        • 2014-11-11
        • 2012-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多