最佳实践:将单个表视图的大小类用于双表视图

时间:2015-07-29 17:02:22

标签: ios swift uitableview autolayout size-classes

我知道'最佳做法'是一个stackoverflow禁忌,但我无论如何都给它一个镜头,因为我认为这很重要,并要求一个特定的答案。自动布局是新的,随着最近宣布的iPad并排多任务处理,自动布局的细微差别从未如此重要。

我的情况:我的应用会有两个列表。在iPhone上,它们一次只能查看一个。我可以做到这一点:

  1. 使用一个可以在两个列表数据数组之间切换的ViewController。
  2. 使用两个ViewControllers,每个都有自己的tableView和数据
  3. 使用一个ViewController和两个表,但总是隐藏一个
  4. 更好的选择?
  5. 我的具体问题:在iPad上,我希望两个列表同时并排显示。 iPhone和iPad都只能以纵向运行应用程序(不支持横向)我看到了一些提供并排视图的选项:

    1. 不确定如何与选项#1并排工作,除了以编程方式为iPad布局添加第二个表
    2. 来自iPhone版本的两个VC将与iPad版本并排显示,使用先前隐藏的容器视图将VC2添加到VC1
    3. 两个表格一次可见
    4. 更好的选择?
    5. 我非常感谢如何实现此功能的答案。虽然我理解每个选项的概念,但我不了解具体的步骤/代码,因此我们将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

我在我的应用程序中有这个确切的场景,我使用了选项#2。

对于iPad,它将使用w-Regular h-Regular尺寸等级。 这个site对大小类有很好的视觉和解释。

  • 在Interface Builder中,切换到w-Regular h-Regular size class。

Size Class Selection

  • 在w-Regular h-Regular中,从对象库中拖出一个容器视图(在Interface Builder的右下角)并将其放在视图中。

Container Selection

  • 在w-Regular h-Regular中,根据需要设置约束,以便在新布局中考虑容器视图。
    • 可能需要关闭现有约束。您可以在约束中的大小检查器中执行此操作。请注意下图中我的约束已安装。单击已安装复选标记左侧的+,在w-Regular h-Regular size class中 uninstall
    • 卸载约束的另一种方法是在屏幕对象的“大小检查器”中突出显示约束,然后按“删除”。它实际上并没有删除约束,它只是从当前的大小类中卸载它。

Installed Constraint

  • 将VC链接到容器视图。按住Ctrl键从Container拖动到VC以创建嵌入segue。您还希望添加代码,以便在iPad上仅使用此嵌入式segue。通过在IB中选择segue并转到Attributes Inspector,为segue提供标识符。在下面的示例代码中,我调用了segue EmbedSegueName。

    - (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender  {
    
        if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && [identifier isEqualToString:@"EmbedSegueName"]) {
            return YES;
        }
    
        return NO;
    }
    
  • 不允许访问第二个VC。我不知道你是如何在iPhone上显示两个不同的VC的,但在我的应用中我使用的是UITTabBarController。这就是我从应用程序的iPad标签栏中删除额外VC的方法。

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    
        //  Remove the tab bar item because it will be contained in the iPad's layout.
        //  In this example, it's removing the 2nd tab bar item.
        NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:[self.tabBarController viewControllers]];
        [viewControllers removeObjectAtIndex:1];
        [self.tabBarController setViewControllers:viewControllers animated:YES];
    }
    

提示:如果您遇到运行iPhone版本的错误,并且抱怨容器视图(即使它没有安装在iPhone的大小上)类),尝试将Container View放入另一个视图,看看是否能解决问题。

我希望这足以让你开始。