我有一个应用程序应该根据加速度计报告的值显示一组不同的视图。我想在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
对象(即leftView
,rightView
和centerView
) Interace Builder。但是,当我这样做的时候,我最终会在IB中混淆不同的意见。我的视图控制器最终将从视图中添加和删除视图,但是设置自动布局的东西非常困难。
最后,这是我的问题。 是否有更好的方法可以在Storyboard编辑器中为一个视图控制器直接排列许多通常重叠的视图,或者我只需要以编程方式设置所有内容?
我的内省常见问题解答,对于狂热的读者:
你为什么如此设置故事板编辑器/ IB?它提供了自动找出视图定位和大小调整的许多痛苦部分。这听起来很不错!如果可能的话,我想让它适合我。
之前有人问这个,对吗?呃,有点儿。 This question最接近我发现的那些。但是,这个解决方案仍然需要我以编程方式设置帧,否定我认为最好使用IB的原因 - 自动布局。 This one让我很兴奋,但事实并非如此。
答案 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)
您可以使用带有三个选项卡的选项卡视图控制器,然后隐藏选项卡栏。我认为这将在技术和语义上很好地映射到您的场景。