UITabBarController上をスワイプで画面遷移する方法【Swift】

UITabBarControllerを久々に見ると??って感じなんですが、スワイプで遷移する方法はわりと簡単でした。通常のタップで遷移はストーリーボード上で行っていますが正直あんまり覚えてないです。また最初から付けるときがあったら記事にしたいと思います・・・・。

 

まずUITabBarというのはこういう下のボタンをタップすると画面遷移するやつ

 

Simulator Screen Shot 2016.03.03 22.15.32

よくみるやつです。

これをスワイプで画面切り替えする方法です。

(ちなみに画像は私のアプリpocket時間割ですぞ)

 

まずUISwipeGestureRecognizerを用意します。

var swipe:UISwipeGestureRecognizer?

そして適当にviewDidLoadの中にでも書いていきましょう

override func viewDidLoad() {
       super.viewDidLoad()        
     swipe = UISwipeGestureRecognizer()
       //スワイプの方向を決める
       swipe!.direction = .Right
       //スワイプするときの指の本数
       swipe!.numberOfTouchesRequired = 1
       //スワイプしたときのアクション
       swipe!.addTarget(self, action: "swipeRight")
       //viewにスワイプジェスチャーを配置
       self.view.addGestureRecognizer(swipe!)
}

後はスワイプしたときのアクションを書きます

func swipeRight(){
    self.tabBarController!.selectedIndex = 1
}

 

このself.tabBarController.selectedIndexはUITabBarControllerに設定した配列の順だそうで。

ストーリーボード上のBarItemのタグの番号ではないですので注意です

スクリーンショット-2016-03-03-23.00.46

普通に横並びで0,1,2で番号がついていると思われるのですが、とりあえずどこに飛ぶか試してみると良いと思います!

 

それぞれのViewControllerに右スワイプで移動、左スワイプで移動を付け足せば遷移するようになります。

 

全体のコード

class ViewController:UIViewController{
     var swipe:UISwipeGestureRecognizer?
     override func viewDidLoad() {
          super.viewDidLoad()
          swipe = UISwipeGestureRecognizer()
          swipe!.direction = .Left
          swipe!.numberOfTouchesRequired = 1
          swipe!.addTarget(self, action: "swipeLeft")
          self.view.addGestureRecognizer(swipe!)
     }
   func swipeLeft(){
        print("swipeLeft")
        self.tabBarController!.selectedIndex = 1
    }
}

 

LeftとRightが先ほどと入れ替わっているので少し注意です。。。

 

スワイプで移動できるんだーってわかりやすくするにはアニメーションとかつけた方がいいとは思います(頑張ります)

 

2018/04/14追記 Swift4で
おきかえ〜
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let swipe = UISwipeGestureRecognizer()
        swipe.direction = .left
        swipe.numberOfTouchesRequired = 1
        swipe.addTarget(self, action: #selector(self.swipeLeft(sender:)))
        self.view.addGestureRecognizer(swipe)
    }
    
    @objc func swipeLeft(sender:UISwipeGestureRecognizer) {
        self.tabBarController?.selectedIndex = 1
    }
selectedIndexするだけで遷移できるもんだっけ。記憶ないや。 最近はこういうやり方ではなくUIPageViewControllerと組み合わせて使ってます。

Comments...

コメントは認証制です。詳しくは下記の注意をお読みください。お気軽にコメントお願いします!

Write a Comment

コメント時の注意

「Twitter」「Facebook」「Google+」「WordPress」のいずれかのアカウントをお持ちの方は各アカウントと連携することでコメントできます。 コメントしたことはSNSに流れませんので、アカウントをお持ちの方はこちらの方法でコメントを投稿して下さると嬉しいです。 アカウントをお持ちでない方はメールアドレスで投稿することができます。 初回コメント時は承認後に表示されます。

Related Memo...

UITableView.RowAnimation の .none はアニメーションするよ

UITableView.RowAnimation の .none はアニメーションがnoneなわけじゃなく、デフォルトの設定を使うよという意味らしい。

The inserted or deleted rows use the default animations.

なのでアニメーションしちゃう。今更の気づき。

 

iOS

記事を書くほどでもないけれどメモっておきたいこと

テスト投稿。

例えばiphone7 の画面サイズ

750 × 1334
半分375 × 667

iOS

UINavigationController + UIScrollView の組み合わせで使っている時に謎の余白ができる時

UINavigationController + UIScrollView の組み合わせで使っていて、UIScrollView 上に AutoLayout で上下左右0で View を設置しているのに、30px程度上にずれてしまうとき。

`navigationController.navigationBar.isTranslucent = false` にすると直るかもしれない。

ScrollView上のコンテンツとNavigationBarの重なっているところが透過していたら多分これで直せるはず。

通常のターゲットではちゃんと動いているのに、iOSSnapshotTestCase を用いたテストでだけこの対応が必要なのよくわからないけれど。。。

iOS
more