LoginSignup
14
10

More than 5 years have passed since last update.

【Swift3.0】サイドメニューもどきを作ってみた

Posted at

はじめに

なんかサイドメニューが出るアプリがかっこいいと思ったので作ってみた。
忘れると虚しいので備忘録としてQiitaさんに残す。

開発環境

  • Xcode8.1
  • Swift3.0

実装方法

イメージとしては、スクリーン内にメイン画面を表示し、左の画面外にサイドメニューを追加する。
アプリ起動直後はサイドメニューはスクリーン外にあるので、スクリーン内に表示されない。
ボタンを押すことで、スクリーン外のサイドメニューをアニメーション付きでスクリーン内に移動させる。
こんな感じでサイドメニューを実装してみた。
IMG_3637.PNG

storyboard

  • storyboardでメイン画面サイドメニューを作成
  • メイン画面にはサイドメニューを出し入れするためのボタンをつける
  • サイドメニューのstoryboard IDにsideMenuと入力する

image

ViewController.swift

ViewController.swift
import UIKit

class ViewController: UIViewController {

    //  サイドメニューが表示中かの真偽
    var isDisplayedSideMenu: Bool = false

    //  スクリーンサイズを格納するための変数
    var screenWidth: CGFloat = 0

    //  storyboard上のサイドメニュー(UIViewController)を格納するためのもの
    var sideMenuVC: UIViewController!


    override func viewDidLoad() {
        super.viewDidLoad()

        //  スクリーンの幅を取得して、変数に格納
        screenWidth = getScreenSize().0

        //  メインビューにサイドメニューを追加
        addSideMenu()
    }


    /*
     *  @IBAction
     */
    //  メイン画面のボタンと紐付ける
    @IBAction func button(_ sender: Any) {
        //  サイドメニューが表示されていない時
        if isDisplayedSideMenu == false {
            //  サイドメニューを出す
            displaySideMenu()
        }
        //  サイドメニューが表示されている時
        else {
            //  サイドメニューを閉じる
            closeSideMenu()
        }
    }


    /*
     *  メソッド
     */
    // スクリーンのサイズを取得するためのメソッド
    func getScreenSize() -> (CGFloat, CGFloat) {

        //  スクリーンサイズを取得
        let screenSize = UIScreen.main.bounds.size

        //  スクリーンの幅と高さを変数に格納
        let width: CGFloat = screenSize.width
        let height: CGFloat = screenSize.height

        return (width, height)
    }

    //  サイドメニューをメインビューに追加するためのメソッド
    func addSideMenu() {

        //  サイドメニューをメインビューに追加
        sideMenuVC = (storyboard?.instantiateViewController(withIdentifier: "sideMenu"))! as UIViewController
        self.addChildViewController(sideMenuVC)
        self.view.addSubview(sideMenuVC.view)
        sideMenuVC.didMove(toParentViewController: self)

        //  画面外に追加したサイドメニューを移動
        sideMenuVC.view.transform = CGAffineTransform(translationX: (screenWidth * -1), y: 0)
    }

    //  サイドメニューをメインビューに出すためのメソッド
    func displaySideMenu() {

        //  サイドメニューをアニメーション付きで移動させる
        UIView.animate(withDuration: 0.2, animations: { () -> Void in
            self.sideMenuVC.view.transform = CGAffineTransform(translationX: (self.screenWidth * -1/2), y: 0)
        })

        //  サイドメニューが表示されていることにする
        isDisplayedSideMenu = true
    }

    //  サイドメニューを格納するためのメソッド
    func closeSideMenu() {

        //  サイドメニューをアニメーション付きで移動させる
        UIView.animate(withDuration: 0.2, animations: { () -> Void in
            self.sideMenuVC.view.transform = CGAffineTransform(translationX: (self.screenWidth * -1), y: 0)
        })

        //  サイドメニューが表示されていることにする
        isDisplayedSideMenu = false
    }
}

起動後
image

ボタンを押すと...
image

14
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
10