Skip to content

Instantly share code, notes, and snippets.

@uruly
Created April 12, 2018 22:45
Show Gist options
  • Save uruly/bcea8bdb066ed6e003dbbf7c0becdf41 to your computer and use it in GitHub Desktop.
Save uruly/bcea8bdb066ed6e003dbbf7c0becdf41 to your computer and use it in GitHub Desktop.
import UIKit
class SwipeNavigationViewController: UINavigationController {
var pageScrollView:UIScrollView!
var viewControllerArray:[UIViewController] = []
var pageController:UIPageViewController!
//固定して表示するもの
var closeBtn:UIButton!
required override init(nibName nibNameOrNil:String?,bundle nibBundleOrNil:Bundle?){
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
required override init(rootViewController:UIViewController){
super.init(rootViewController:rootViewController)
}
override func viewDidLoad() {
super.viewDidLoad()
self.navigationBar.isHidden = true
}
override func viewWillAppear(_ animated: Bool) {
self.setupPageViewController()
self.setupView()
}
//PageViewControllerのセットアップ
func setupPageViewController(){
//NavigationControllerのtopViewControllerを生成
pageController = self.topViewController as! UIPageViewController
//デリゲートを設定
pageController.delegate = self
pageController.dataSource = self
//ページコントローラーにビューコントローラーを設定
pageController.setViewControllers([viewControllerArray[0]], direction: .forward, animated: true, completion: nil)
self.syncScrollView()
}
func syncScrollView(){
for view in pageController.view.subviews{
if view.isKind(of:UIScrollView.self){
pageScrollView = view as! UIScrollView
pageScrollView.delegate = self
}
}
}
func setupView() {
closeBtn = UIButton()
closeBtn.frame = CGRect(x:10,y:10,width:50,height:50)
closeBtn.setTitle("×", for: .normal)
closeBtn.addTarget(self,action:#selector(self.closeBtnTapped),for:.touchUpInside)
pageController.view.addSubview(closeBtn)
}
@objc func closeBtnTapped(){
dismiss(animated: true, completion: nil)
}
//viewControllerのindexを返す
func indexOfController(viewController:UIViewController) -> Int{
for i in 0 ..< viewControllerArray.count{
if(viewController == viewControllerArray[i]){
return i
}
}
return NSNotFound
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
extension SwipeNavigationViewController: UIPageViewControllerDelegate {
}
extension SwipeNavigationViewController: UIPageViewControllerDataSource {
//左にスワイプしたとき(ページが進む)
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
var index:Int = self.indexOfController(viewController:viewController)
if(index == NSNotFound){
return nil
}
index += 1
if(0 <= index && index < viewControllerArray.count){
return viewControllerArray[index]
}
return nil
}
//右にスワイプしたとき(ページが戻る)
func pageViewController(_ pageViewController:UIPageViewController,viewControllerBefore viewController:UIViewController) -> UIViewController?{
var index:Int = self.indexOfController(viewController:viewController)
if(index == NSNotFound){
return nil
}
index -= 1
if(0 <= index && index < viewControllerArray.count){
return viewControllerArray[index]
}
return nil
}
}
extension SwipeNavigationViewController: UIScrollViewDelegate {
}
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.blue
//ボタンタップでSwipeNavigationViewControllerに遷移する
let btn = UIButton(frame:CGRect(x:10,y:30,width:100,height:50))
btn.addTarget(self, action: #selector(self.btnTapped), for: .touchUpInside)
btn.backgroundColor = UIColor.red
self.view.addSubview(btn)
}
@objc func btnTapped() {
let pageController:UIPageViewController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
let navigationController:SwipeNavigationViewController = SwipeNavigationViewController(rootViewController: pageController)
//これがないと上に隙間ができる
pageController.automaticallyAdjustsScrollViewInsets = false
let firstView = FirstViewController()
let secondView = SecondViewController()
navigationController.viewControllerArray = [firstView,secondView]
present(navigationController, animated: true, completion: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment