故事板可在不同时间显示多个视图

时间:2013-09-27 21:07:52

标签: ios uiview uiviewcontroller uistoryboard

我有一个应用程序应该根据加速度计报告的值显示一组不同的视图。我想在Xcode,néeInterfaceBuilder中的Storyboard Editor中设置视图。此外,我想使用Xcode的新版自动布局工具。基本上,这些工具允许您定义对象间约束,运行时系统可以确定所述对象的位置。

以下是伪代码中我想要的一个简单示例:

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

我知道要做虚构的showSubview:方法,我实际上必须删除当前显示的任何不正确的视图,并添加我想要的那个,但这不是重点。

如前所述,我想使用Storyboard Editor /列出每个UIView对象(即leftViewrightViewcenterView) Interace Builder。但是,当我这样做的时候,我最终会在IB中混淆不同的意见。我的视图控制器最终将从视图中添加和删除视图,但是设置自动布局的东西非常困难。

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


我的内省常见问题解答,对于狂热的读者:

  1. 你为什么如此设置故事板编辑器/ IB?它提供了自动找出视图定位和大小调整的许多痛苦部分。这听起来很不错!如果可能的话,我想让它适合我。

  2. 之前有人问这个,对吗?呃,有点儿。 This question最接近我发现的那些。但是,这个解决方案仍然需要我以编程方式设置帧,否定我认为最好使用IB的原因 - 自动布局。 This one让我很兴奋,但事实并非如此。

2 个答案:

答案 0 :(得分: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"]];

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

答案 1 :(得分:0)

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