참고 [iOS Tutorial: How to make a customizable interactive slide-out menu in Swift](https://www.thorntech.com/2016/03/ios-tutorial-make-interactive-slide-menu-swift/](https://www.thorntech.com/2016/03/ios-tutorial-make-interactive-slide-menu-swift/))
Scroll View 내부에 Container Views를 중첩하여 슬라이드 아웃 메뉴를 만들 수 있지만, 몇 가지 단점이 있다.
이 튜토리얼에서는 다음의 기능을 포함하는 interactive slide-out menu를 만든다.
// AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
window?.rootViewController = MainViewController()
return true
}
// MainViewController.swift
import UIKit
class MainViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .blue
self.setNavigationBar()
}
func setNavigationBar() {
let screenSize: CGRect = UIScreen.main.bounds
let navBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: screenSize.width, height: 44))
let navItem = UINavigationItem(title: "")
let menuItem = UIBarButtonItem(title: "menu", style: .plain, target: self, action: #selector(goToSideMenu))
navItem.leftBarButtonItem = menuItem
navBar.setItems([navItem], animated: false)
self.view.addSubview(navBar)
}
@objc func goToSideMenu() {
let sideVC = SideViewController()
present(sideVC, animated: true , completion: nil)
}
}
// SideViewController.swift
import UIKit
class SideViewController: UIViewController {
let backButton: UIButton = {
let button = UIButton()
button.backgroundColor = .cyan
button.setTitle("뒤로가기", for: .normal)
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .red
view.addSubview(backButton)
backButton.translatesAutoresizingMaskIntoConstraints = false
backButton.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -8).isActive = true
backButton.topAnchor.constraint(equalTo: view.topAnchor, constant: 8).isActive = true
backButton.widthAnchor.constraint(equalToConstant: 100).isActive = true
backButton.heightAnchor.constraint(equalToConstant: 40).isActive = true
backButton.addTarget(self, action: #selector(back), for: .touchUpInside)
}
@objc func back() {
dismiss(animated: true, completion: nil)
}
}