Use UITabBarViewController in portrait, but UISplitViewController in landscape in generic application

I want to use UITabBarViewController when on iPhone in portrait and UISplitViewController when on iPhone 6/6 + in landscape or iPad in any orientation. When on an iPad or iPhone 6/6 + landscape, the tab bar items are UITableViewCells in the top view of the controller.

I would really like the caller not to worry about the device or the orientation, but instead pass the input data to the view controllers located in the tab bar on the iPhone in the portrait and in the root view controller on the iPad and iPhone 6/6 + in the landscape.

Here is a visual representation of what I mean:

UISplitViewController / UITabBarController

, , , , . Swift, , :

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) {

    }

}

? ? , ( )? (, ) ?

+4
1

, , , - , , , :

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
}
+3

All Articles