基本上它执行以下操作:
后面的菜单实际上是一个UIViewController.如果我们深入研究源代码,我们将找到以下非常重要的代码:
public init(items: [MediumMenuItem], forViewController: UIViewController) { self.init() self.items = items height = screenHeight - 80 // auto-calculate initial height based on screen size frame = CGRect(x: 0, y: 0, width: screenWidth, height: height) contentController = forViewController menuContentTableView = UITableView(frame: frame) menuContentTableView?.delegate = self menuContentTableView?.dataSource = self menuContentTableView?.showsVerticalScrollIndicator = false menuContentTableView?.separatorColor = UIColor.clearColor() menuContentTableView?.backgroundColor = menuBackgroundColor addSubview(menuContentTableView!) if panGestureEnable { let pan = UIPanGestureRecognizer(target: self, action: #selector(MediumMenu.didPan(_:))) contentController?.view.addGestureRecognizer(pan) } let menuController = UIViewController() menuController.view = self UIApplication.sharedApplication().delegate?.window??.rootViewController = contentController UIApplication.sharedApplication().delegate?.window??.insertSubview(menuController.view, atIndex: 0) }
前几行并不重要,但是最后一行(处理UIApplication.sharedApplication().委托?.window ??是这个库工作的关键,但它们也限制了库.
根据这些行,我们正在制作UIViewController,我们希望菜单为rootViewController,然后我们将菜单视图添加到0索引的窗口(我猜这是将它放在后面,后面contentController).
图书馆的问题:
只有在初始视图控制器上需要菜单时,该库才有效.从某种意义上说,只有contentController已经是rootViewController.它实际上对我来说在我的应用程序中起作用,但是我不能再回到我原来的UIViewController,因为它不再在层次结构中了.
我有一个场景,我有一个登录视图控制器,当你成功登录时,我将你转到我想要菜单的UINavigationController.问题的第一个明显标志是我收到投诉“警告:尝试在LoginViewController上呈现UINavigationController,其视图不在窗口层次结构中!”显然,它不在窗口层次结构中,因为我正在重新分配rootViewController.
我不知道如何解决这个问题.当UIViewController我希望菜单不是初始视图控制器时,有没有办法让这个功能工作?
简短的回答是:是的.这可以通过将UIViewControllerTransitioningDelegate分配给包含list-menu的ViewController并实现interactionControllerForPresentation()和interactionControllerForDismissal()方法来实现.您不必直接触摸UIWindow.
您可以只更改现有库的这一部分,但从它的外观来看,它只是一个带有奇特过渡的TableView.你可以自己轻松实现这一点.
查看Apple的API Reference在交互式过渡和this tutorial由Ray Wenderlich进行示例.