web-dev-qa-db-ja.com

スワイプジェスチャを使用してタブバー間を移動する

スワイプジェスチャを使用してタブバー間を移動したい。それを行う最も簡単な方法は何ですか?私はこのようなことを試みました...

import UIKit

class postAdViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        var leftSwipe = UISwipeGestureRecognizer(target: self, action: Selector("handleSwipes:"))
        view.addGestureRecognizer(leftSwipe)    
    }

    func handleSwipes(sender:UISwipeGestureRecognizer) {
        if (sender.direction == .left) {
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let vc = storyboard.instantiateViewController(withIdentifier: "favourireviewcontroller") as! UIViewController
            self.present(vc, animated: true, completion: nil)
        }
        if (sender.direction == .right) {

        }
}

右にスワイプしようとしても何も起こりません。スワイプすると次のエラーメッセージが表示され、アプリがクラッシュします

認識されないセレクターがインスタンス0x7f924380a730に送信されました

6
Md Oliuzzaman

tabBarをナビゲートしたい場合は、.left.rightswipeGestureRecognizerを実装してから、tabBarController?.selectedIndexを操作する必要があります。 :

let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(swiped))
swipeRight.direction = UISwipeGestureRecognizerDirection.right
self.view.addGestureRecognizer(swipeRight)

let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(swiped))
swipeLeft.direction = UISwipeGestureRecognizerDirection.left
self.view.addGestureRecognizer(swipeLeft)

func swiped(_ gesture: UISwipeGestureRecognizer) {
    if gesture.direction == .left {
        if (self.tabBarController?.selectedIndex)! < 2 { // set your total tabs here
            self.tabBarController?.selectedIndex += 1
        }
    } else if gesture.direction == .right {
        if (self.tabBarController?.selectedIndex)! > 0 {
            self.tabBarController?.selectedIndex -= 1
        }
    }
}
4
Rashwan L

これは、TabBarコントローラーを介して左右にスワイプするSwift4の例です。

このソリューションについて私が気に入らない点:-ハンドラーを一度登録して、ハンドラー自体の方向を区別できるはずですが、簡単にそれを行うことはできませんでした。 -視覚効果のためのドラッグを含むジェスチャーを行う方法にも興味があります。それを実現するには、PanGestureも含める必要があると思います。

override func viewDidLoad() {
    super.viewDidLoad()

    let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipes(_:)))
    let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipes(_:)))
    leftSwipe.direction = .left
    rightSwipe.direction = .right
    self.view.addGestureRecognizer(leftSwipe)
    self.view.addGestureRecognizer(rightSwipe)

}

そして、ハンドラー:

@objc func handleSwipes(_ sender:UISwipeGestureRecognizer) {
    if sender.direction == .left {
        self.tabBarController!.selectedIndex += 1
    }
    if sender.direction == .right {
        self.tabBarController!.selectedIndex -= 1
    }
}
4
Byron Salty

Swift 4セレクター構文を使用してみてください:

//below code write in view did appear()
let swipeRight = UISwipeGestureRecognizer(target: self, action:  #selector(swiped))
    swipeRight.direction = UISwipeGestureRecognizerDirection.right
    self.view.addGestureRecognizer(swipeRight)

    let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(swiped))
    swipeLeft.direction = UISwipeGestureRecognizerDirection.left
    self.view.addGestureRecognizer(swipeLeft)
  // below code create swipe gestures function

  // MARK: - swiped
   @objc  func swiped(_ gesture: UISwipeGestureRecognizer) {
    if gesture.direction == .left {
        if (self.tabBarController?.selectedIndex)! < 2
        { // set here  your total tabs
            self.tabBarController?.selectedIndex += 1
        }
    } else if gesture.direction == .right {
        if (self.tabBarController?.selectedIndex)! > 0 {
            self.tabBarController?.selectedIndex -= 1
        }
    }
}
1
praful argiddi

これは、Swift 5およびiOS12の準備ができている以前の提案のわずかに変更されたバージョンです。

本当の利点は次のとおりです。

  1. guardステートメントを使用するため、ハンドラーでtabBarControllerviewControllersのラップを解除する必要はありません。
  2. ハードコードされた数のタブは必要ありません— viewControllers配列から取得するだけです。

また、少し冗長にするために少しクリーンアップしました。これは、iOS12で実行されているSwift 5でテストされています(iOS 11.4でテストされた最小の展開バージョンであるため、問題ないはずです)。

これらをviewDidLoad(または選択した他の適切な場所)に追加します。

let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipeGesture))
swipeRight.direction = .right
self.view.addGestureRecognizer(swipeRight)

let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipeGesture))
swipeLeft.direction = .left
self.view.addGestureRecognizer(swipeLeft)

次に、これをイベントのハンドラーとして追加します。

@objc func handleSwipeGesture(_ gesture: UISwipeGestureRecognizer) {
  guard let tabBarController = tabBarController, let viewControllers = tabBarController.viewControllers else { return }
  let tabs = viewControllers.count        
  if gesture.direction == .left {
      if (tabBarController.selectedIndex) < tabs {
          tabBarController.selectedIndex += 1
      }
  } else if gesture.direction == .right {
      if (tabBarController.selectedIndex) > 0 {
          tabBarController.selectedIndex -= 1
      }
  }
}
1
Evan Stone

Swift 3セレクター構文を使用してみてください。

let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipes(_:))

そのようです

override func viewDidLoad() {
    super.viewDidLoad()

    nextButton.layer.cornerRadius = 7

    let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipes(_:))
    //leftSwipe.direction = .right
    view.addGestureRecognizer(leftSwipe)
}



func handleSwipes(_ sender: UISwipeGestureRecognizer) {
    if (sender.direction == .left) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "favourireviewcontroller") as! UIViewController
        self.present(vc, animated: true, completion: nil)
    }

    if (sender.direction == .right) {

    }
}

Swift 3は、指定しているfunctionが実際に存在するかどうかをコンパイラーがチェックできるようにするこの機能を導入しました。したがって、以前の概念よりもはるかに節約できます。

0
productioncoder