在通用应用程序中,竖屏使用UITabBarViewController,横屏使用UISplitViewController。

6
当iPhone处于竖屏状态时,我希望使用UITabBarViewController;当iPhone 6/6+处于横屏状态或iPad处于任何方向时,我希望使用UISplitViewController。当iPad或iPhone 6/6+处于横屏状态时,选项卡栏目以UITableViewCells的形式呈现在最顶层的视图控制器中。
我希望调用对象不必担心设备或方向,而是将在iPhone竖屏状态下的选项卡中的视图控制器和在iPad和iPhone 6/6+横屏状态下的根视图控制器作为输入传入。
以下是我所说的内容的可视化表示:
[图片]
我认为可以使用选项卡栏目图像属性在表格视图单元格中放置图像。我正在使用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) {

    }

}

这是可能的吗?这已经完成了吗?我应该实现一个选项卡视图控制器,在横向时隐藏其选项卡(这对我来说似乎很hacky)?当方向发生变化时,如何将生成的根表视图控制器(我希望选项卡项目存在其中)添加到视图层次结构中?
1个回答

4
我已经搞清楚了如何做到这一点,虽然它并不包含任何人需要的解决方案,但我已经在下面提供了代码,您可以根据自己的需求进行定制: < p > < code > 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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接