在纵向中使用UITabBarViewController,但在Universal应用程序中使用UISplitViewController [英] Use UITabBarViewController in portrait but UISplitViewController in landscape in a Universal app

查看:136
本文介绍了在纵向中使用UITabBarViewController,但在Universal应用程序中使用UISplitViewController的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在iPhone上使用UITabBarViewController时使用UITabBarViewController,在iPhone 6/6 +上使用UISplitViewController时可以在任意方向使用横向或iPad。在iPad或iPhone 6/6 +横向上时,标签栏项目在最顶层的视图控制器中显示为UITableViewCells。

I want to use a UITabBarViewController when on iPhone in portrait and a UISplitViewController when on iPhone 6/6+ in landscape or iPad in either orientation. When on iPad or iPhone 6/6+ landscape, the tab bar items present themselves as UITableViewCells in the topmost view controller.

我真的希望调用对象不必担心设备或方向,而是传递iPhone上标签栏中的视图控制器作为输入在iPad和iPhone 6/6 +横向上的根视图控制器中的肖像。

I would really like for the calling object to not have to worry about device or orientation, but instead pass as input the view controllers that are in the tab bar on iPhone in portrait and in the root view controller on iPad and iPhone 6/6+ in landscape.

这是我的意思的直观表示:

Here's a visual representation of what I mean:

我认为可能还可以使用tab bar images属性将图像放置在表格视图单元格中。我在Swift中这样做,我认为这个策略可能是这样的:

I think it's likely possible to use the tab bar images property to place an image in the table view cells, as well. I'm doing this in Swift, and I think a strategy for this might be something like this:

class ResponsiveRootViewController: UIViewController {

    var viewControllers: NSArray?
    var responsiveTabBarController: UITabBarController?
    var responsiveSplitViewController: UISplitViewController?
    var responsiveRootViewController: UITableViewController?

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {

    }

}

这可能吗?这已经完成了吗?我应该改为实现一个标签栏视图控制器,它在横向上隐藏它的标签栏(这对我来说似乎超级hacky)?当方向更改时,如何将生成的根表视图控制器(我希望标签栏项存在的控制器)添加到视图层次结构中?

Is this possible? Has this already been done? Should I instead implement a tab bar view controller that hides its tab bar in landscape (this seems super hacky to me)? How do I add my generated root table view controller (the one which I'd like the tab bar items to exist in) into the view hierarchy when the orientation changes?

推荐答案

我已经弄清楚如何做到这一点,虽然它不包含任何人需要的解决方案,但我已经包含了您可以根据自己的特定需求自定义代码:

I've worked out how to do this, and while it doesn't contain solution anyone needs, I have included the code below which you can customise to your specific needs:

SplitTabBarViewController.swift

var rootViewControllers: [UIViewController]
var detailViewController: UIViewController
var aTabBarController: UITabBarController
var aSplitViewController: UISplitViewController
var primaryTabBarTableViewController: SplitTabBarPrimaryTableViewController

init(rootViewControllers: [UIViewController], detailViewController: UIViewController) {
    self.rootViewControllers = rootViewControllers
    self.detailViewController = detailViewController

    self.aTabBarController = UITabBarController()
    self.aTabBarController.viewControllers = self.rootViewControllers

    self.aSplitViewController = UISplitViewController()
    self.primaryTabBarTableViewController = SplitTabBarPrimaryTableViewController(rootViewControllers: self.rootViewControllers)
    self.aSplitViewController.viewControllers = [self.primaryTabBarTableViewController, self.detailViewController]

    super.init(nibName: nil, bundle: nil)
}

override func viewDidLoad() {
    super.viewDidLoad()
    if (UIInterfaceOrientationIsLandscape(UIApplication.sharedApplication().statusBarOrientation)) {
        self.addSplitViewController()
    } else {
        self.addTabBarController()
    }
}

override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
    if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) {
        self.removeTabBarController()
        self.addSplitViewController()
    } else {
        self.removeSplitViewController()
        self.addTabBarController()
    }
}

func addTabBarController() {
    self.view.addSubview(self.aTabBarController.view)
    self.addChildViewController(self.aTabBarController)
    self.aTabBarController.view.frame = self.view.frame
}

func removeTabBarController() {
    self.aTabBarController.removeFromParentViewController()
    self.aTabBarController.view.removeFromSuperview()
}

func addSplitViewController() {
    self.view.addSubview(self.aSplitViewController.view)
    self.addChildViewController(self.aSplitViewController)
    self.aSplitViewController.view.frame = self.view.frame
}

func removeSplitViewController() {
    self.aSplitViewController.removeFromParentViewController()
    self.aSplitViewController.view.removeFromSuperview()
}

SplitTabBarPrimaryTableViewController.swift

var rootViewControllers: [UIViewController]

init(rootViewControllers: [UIViewController]) {
    self.rootViewControllers = rootViewControllers;

    super.init(nibName: nil, bundle: nil)
}

override func viewDidLoad() {
    super.viewDidLoad()

    self.tableView.registerClass(UITableViewCell.classForCoder(), forCellReuseIdentifier: "reuseIdentifier")
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.rootViewControllers.count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) as! UITableViewCell

    cell.textLabel?.text = self.rootViewControllers[indexPath.row].title

    return cell
}

这篇关于在纵向中使用UITabBarViewController,但在Universal应用程序中使用UISplitViewController的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆