1

我有一个应用程序,它应该根据加速度计报告的值显示一组不同视图中的一个。我想在 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对象(即leftViewrightView和)。centerView但是,当我这样做时,我最终会在 IB 中将不同的视图叠加在一起,令人困惑。我的视图控制器最终会从它的视图中添加和删除视图,但是这样设置自动布局的东西是相当困难的。

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


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

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

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

4

2 回答 2

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"]];

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

于 2013-09-27T21:40:40.163 回答
0

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

于 2013-09-29T20:35:36.060 回答