私が本当に楽しんでいるライブラリがここにあります ( https://github.com/pixyzehn/MediumMenu )。
基本的に、次のことを行います。
奥のメニューは実は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().delegate?.window??
は、このライブラリが機能するための鍵となりますが、ライブラリを制限します。
これらの行によると、メニューを表示する UIViewController を作成しrootViewController
、メニュー ビューをウィンドウのインデックス 0 に追加します (これが、メニュー ビューを後ろに配置するものだと思います)。contentController
)。
ライブラリの問題:
ライブラリは、最初のView Controllerにメニューが必要な場合にのみ機能します。ある意味では、contentController がすでに rootViewController である場合のみです。私のアプリでは実際に機能しますが、元の UIViewController は階層にないため、元の UIViewController に戻ることはできません。
Login View Controller があるシナリオがあります。ログインに成功すると、メニューが必要な UINavigationController に移動します。問題の最初の明確な兆候は、「警告: ビューがウィンドウ階層にない LoginViewController に UINavigationController を提示しようとしています!」という苦情が表示されることです。明らかに、rootViewController を再割り当てしているため、ウィンドウ階層にはありません。
これを修正する方法がわかりません。メニューを表示したい UIViewController が最初のビュー コントローラーでない場合に、この機能を動作させる方法はありますか?