4 yönde de kaydırmayı tanımak


131

Aşağı ve sonra sağa kaydırma hareketini tanımak için kaydırmayı kullanmam gerekiyor. Ancak hızlı bir şekilde UISwipeGestureRecognizer'ın önceden doğru yön belirlemesi var .. Ve bunu diğer yönleri kullanmak için nasıl yapacağınızı bilmiyorum ..

Yanıtlar:


324

UISwipeGestureRecognizerHer yön için bir tane olması gerekir . Bu biraz garip çünkü UISwipeGestureRecognizer.directionözellik, seçenekler tarzı bir bit maskesidir, ancak her tanıyıcı yalnızca bir yönü işleyebilir. İsterseniz hepsini aynı işleyiciye gönderebilir, orada sıralayabilir veya farklı işleyicilere gönderebilirsiniz. İşte bir uygulama:

override func viewDidLoad() {
    super.viewDidLoad()

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

    let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(respondToSwipeGesture))
    swipeDown.direction = .down
    self.view.addGestureRecognizer(swipeDown)
}

@objc func respondToSwipeGesture(gesture: UIGestureRecognizer) {

    if let swipeGesture = gesture as? UISwipeGestureRecognizer {

        switch swipeGesture.direction {
        case .right:
            print("Swiped right")
        case .down:
            print("Swiped down")
        case .left:
            print("Swiped left")
        case .up:
            print("Swiped up")
        default:
            break
        }
    }
}

Swift 3:

override func viewDidLoad() {
    super.viewDidLoad()

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

    let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
    swipeDown.direction = UISwipeGestureRecognizerDirection.down
    self.view.addGestureRecognizer(swipeDown)
}

func respondToSwipeGesture(gesture: UIGestureRecognizer) {
    if let swipeGesture = gesture as? UISwipeGestureRecognizer {
        switch swipeGesture.direction {
        case UISwipeGestureRecognizerDirection.right:
            print("Swiped right")
        case UISwipeGestureRecognizerDirection.down:
            print("Swiped down")
        case UISwipeGestureRecognizerDirection.left:
            print("Swiped left")
        case UISwipeGestureRecognizerDirection.up:
            print("Swiped up")
        default:
            break
        }
    }
}

"her tanıyıcı yalnızca bir yönü idare edebilir" - bu doğru değil. Stackoverflow.com/questions/16184539/… sayfasına
Sergey Skoblikov

3
"her tanıyıcı yalnızca tek bir yönü idare edebilir" - Spesifik olmak için Swift'de doğrudur ve Objective-C'de yanlıştır.
King-Wizard

13
Ect'in UISwipeGestureRecognizerDirectionönüne eklemek zorunda değilsiniz .Down. swipeDown.direction = .DownYeterince sadece kullanın . Sadece bir ipucu =)
Paul Peelen

aynı hareketRecogniser nesnesini birden fazla görünüme ekleyebilir miyiz? Denedim ama çalışmadım.
Maksimum

3
@Sergey Skoblikovs'un yaklaşımını hızlı bir şekilde yaparsanız, (yaparak swipe.direction = [.Right,.Down,.Up,.Left]), tanıyan aranmayacaktır , belki de bu hızlı ile ilgili bir sorundur, ancak şu an itibariyle çalışmıyor.
Knight0fDragon

55

Sadece buna katkıda bulunuyormuşum gibi hissettim, sonunda daha zarif görünüyor:

func addSwipe() {
    let directions: [UISwipeGestureRecognizerDirection] = [.Right, .Left, .Up, .Down]
    for direction in directions {
        let gesture = UISwipeGestureRecognizer(target: self, action: Selector("handleSwipe:"))
        gesture.direction = direction
        self.addGestureRecognizer(gesture)
    }
}

func handleSwipe(sender: UISwipeGestureRecognizer) {
    print(sender.direction)
}

10
self.addGestureRecognizer(gesture)benim için bir hataya neden oldu. Düzeltilen şeydi self.view.addGestureRecognizer(gesture);.
ahitt6345

1
@ ahitt6345 Kodumu bir UIViewalt sınıfta kullanıyordum , ama eğer bir alt sınıfta iseniz kesinlikle haklısınız UIViewController!
Alexandre Cassagne

1
Temiz, benim için en iyi cevap.
Christopher Smit

22

Film şeridinden:

  1. Görünümünüze dört kaydırma hareketi tanıyıcı ekleyin.
  2. Her birini öznitelik denetçisinin hedef yönüyle ayarlayın. Sağ, sol, yukarı veya aşağı seçebilirsiniz
  3. Tek tek, kaydırma hareketi tanıyıcıyı seçin, kontrol edin + görünüm denetleyicinize sürükleyin. Adı girin (soldan hareket, sağa hareket, yukarı hareket ve aşağı hareket diyelim), bağlantıyı şu şekilde değiştirin: Eylem ve tür: UISwipeGestureRecognizer

ViewController'ınızdan:

@IBAction func rightGesture(sender: UISwipeGestureRecognizer) {
    print("Right")
}
@IBAction func leftGesture(sender: UISwipeGestureRecognizer) {
    print("Left")
}
@IBAction func upGesture(sender: UISwipeGestureRecognizer) {
    print("Up")
}

@IBAction func downGesture(sender: UISwipeGestureRecognizer) {
    print("Down")
}  

5
Bu cevapla çok fazla kod yazmanıza gerek yok, ancak film şeridini ve film şeridi ile kodunuz arasındaki bağlantıları kullanırsınız. Geliştiricinin bu şekilde çalışmayı tercih etmesi durumunda bu cevap daha kolay olabilir ancak geliştirici kodlamada daha çok çalışmayı tercih ederse kesinlikle ilk cevap en iyisidir.
user3099333

Bir yerine 4 kaydırma hareketi kullandım ve iş yükünün çoğu kodlama yerine film şeridinde.
user3099333

9

Son zamanlarda işler değişmiş gibi görünüyor. XCode 7.2'de aşağıdaki yaklaşım çalışır:

override func viewDidLoad() {
    super.viewDidLoad()

    let swipeGesture = UISwipeGestureRecognizer(target: self, action: "handleSwipe:")
    swipeGesture.direction = [.Down, .Up]
    self.view.addGestureRecognizer(swipeGesture)
}

func handleSwipe(sender: UISwipeGestureRecognizer) {
    print(sender.direction)
}

Simulator'da iOS 8.4 ve 9.2'de ve gerçek cihazda 9.2'de test edilmiştir.

Veya mlcollard'ın kullanışlı uzantısını burada kullanarak :

let swipeGesture = UISwipeGestureRecognizer() {
    print("Gesture recognized !")
}

swipeGesture.direction = [.Down, .Up]
self.view.addGestureRecognizer(swipeGesture)

5
Seçici aranabilir ancak göndericinin yönü yanlış. Diğer bir deyişle, kaydırmanın yönünü bilmeniz gerekmiyorsa ancak başka türlü değilse bu yaklaşım iyidir.
Robert Gummesson

Artık çalışmıyor. Swift 3'te, bağlam ilk değere sağlanmalıdır:[UISwipeGestureRecognizerDirection.right, .left, .up, .down]
Brent Faust

7

Apple Swift 3.1 sürümü - Xcode Sürüm 8.3 (8E162)

Alexandre Cassagne'nin yaklaşımının kullanışlı yolu

let directions: [UISwipeGestureRecognizerDirection] = [.up, .down, .right, .left]
for direction in directions {
    let gesture = UISwipeGestureRecognizer(target: self, action: #selector(YourClassName.handleSwipe(gesture:)))
    gesture.direction = direction
    self.view?.addGestureRecognizer(gesture)   
}

func handleSwipe(gesture: UISwipeGestureRecognizer) {
    print(gesture.direction)
    switch gesture.direction {
    case UISwipeGestureRecognizerDirection.down:
        print("down swipe")
    case UISwipeGestureRecognizerDirection.up:
        print("up swipe")
    case UISwipeGestureRecognizerDirection.left:
        print("left swipe")
    case UISwipeGestureRecognizerDirection.right:
        print("right swipe")
    default:
        print("other swipe")
    }
}

1
Bu özel defaults write com.apple.dt.xcode IDEPlaygroundDisableSimulatorAlternateFramebuffer -bool YESyapıyla, bazı donanımlardaki bir hatayı düzeltmek için Terminal'de çalıştırmanız gerekir . Xcode'un yeni bir sürümünde düzeltilmesi gerekiyor
Sirens

6

Swift 4.2 ve Xcode 9.4.1'de

, Animasyon temsilci ekle CAAnimationDelegate dersinize

//Swipe gesture for left and right
let swipeFromRight = UISwipeGestureRecognizer(target: self, action: #selector(didSwipeLeft))
swipeFromRight.direction = UISwipeGestureRecognizerDirection.left
menuTransparentView.addGestureRecognizer(swipeFromRight)

let swipeFromLeft = UISwipeGestureRecognizer(target: self, action: #selector(didSwipeRight))
swipeFromLeft.direction = UISwipeGestureRecognizerDirection.right
menuTransparentView.addGestureRecognizer(swipeFromLeft)

//Swipe gesture selector function
@objc func didSwipeLeft(gesture: UIGestureRecognizer) {
    //We can add some animation also
    DispatchQueue.main.async(execute: {
            let animation = CATransition()
            animation.type = kCATransitionReveal
            animation.subtype = kCATransitionFromRight
            animation.duration = 0.5
            animation.delegate = self
            animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
            //Add this animation to your view
            self.transparentView.layer.add(animation, forKey: nil)
            self.transparentView.removeFromSuperview()//Remove or hide your view if requirement.
        })
}

//Swipe gesture selector function
@objc func didSwipeRight(gesture: UIGestureRecognizer) {
        // Add animation here
        DispatchQueue.main.async(execute: {
            let animation = CATransition()
            animation.type = kCATransitionReveal
            animation.subtype = kCATransitionFromLeft
            animation.duration = 0.5
            animation.delegate = self
            animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
            //Add this animation to your view
            self.transparentView.layer.add(animation, forKey: nil)
            self.transparentView.removeFromSuperview()//Remove or hide yourview if requirement.
        })
}

Hareketleri görünümden kaldırmak istiyorsanız bu kodu kullanın

self.transparentView.removeGestureRecognizer(gesture)

Ör:

func willMoveFromView(view: UIView) {
    if view.gestureRecognizers != nil {
        for gesture in view.gestureRecognizers! {
            //view.removeGestureRecognizer(gesture)//This will remove all gestures including tap etc...
            if let recognizer = gesture as? UISwipeGestureRecognizer {
                //view.removeGestureRecognizer(recognizer)//This will remove all swipe gestures
                if recognizer.direction == .left {//Especially for left swipe
                    view.removeGestureRecognizer(recognizer)
                }
            }
        }
    }
}

Bu işlevi şöyle çağırın

//Remove swipe gesture
self.willMoveFromView(view: self.transparentView)

Bunun gibi, kalan yönleri yazabilir ve aşağıdan yukarıya ve aşağıdan yukarıya kaydırma görünümünüz olup olmadığına lütfen dikkat edin.

Kaydırma görünümünüz varsa, Yukarıdan aşağıya için çakışma olur ve tersi hareketleri görüntülersiniz.


4

UISwipeGestureRecognizerdirectionaşağıdaki tanıma sahip bir özelliğe sahiptir:

var direction: UISwipeGestureRecognizerDirection

Bu hareket tanıyıcı için izin verilen kaydırma yönü.


Swift 3.0.1 (ve altı) ile ilgili sorun, UISwipeGestureRecognizerDirectionuygun olsa bile OptionSet, aşağıdaki kod parçacığının derleneceği ancak beklenen herhangi bir olumlu sonuç üretmeyeceğidir:

// This compiles but does not work
let gesture = UISwipeGestureRecognizer(target: self, action: #selector(gestureHandler))
gesture.direction = [.right, .left, .up, .down]
self.addGestureRecognizer(gesture)

Geçici bir çözüm olarak, UISwipeGestureRecognizeristenen her biri için bir tane oluşturmanız gerekecektir direction.


Aşağıdaki Oyun Alanı kodu, Array yöntemini kullanarak UISwipeGestureRecognizeraynı UIViewve aynı şey için birkaç tanesinin nasıl uygulanacağını gösterir :selectormap

import UIKit
import PlaygroundSupport

class SwipeableView: UIView {
    convenience init() {
        self.init(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
        backgroundColor = .red

        [UISwipeGestureRecognizerDirection.right, .left, .up, .down].map({
            let gesture = UISwipeGestureRecognizer(target: self, action: #selector(gestureHandler))
            gesture.direction = $0
            self.addGestureRecognizer(gesture)
        })
    }

    func gestureHandler(sender: UISwipeGestureRecognizer) {
        switch sender.direction {
        case [.left]:   frame.origin.x -= 10
        case [.right]:  frame.origin.x += 10
        case [.up]:     frame.origin.y -= 10
        case [.down]:   frame.origin.y += 10
        default:        break
        }
    }
}

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        view.addSubview(SwipeableView())
    }
}

let controller = ViewController()
PlaygroundPage.current.liveView = controller

xcode 8.3'te hala aynı sorun - derlendi ama çalışmıyor - Sadece sola ve sağa geri döndümUISwipeGestureRecognizerDirection(rawValue: 15)
John

4

@Alexandre Cassagne'ı temel alan Swift 5 ve XCode 11'de hareketi istediğiniz görünüme kaydırın veya denetleyicinin tam görünümünü görüntüleyin

override func viewDidLoad() {
    super.viewDidLoad()

    addSwipe()
}

func addSwipe() {
    let directions: [UISwipeGestureRecognizer.Direction] = [.right, .left, .up, .down]
    for direction in directions {
        let gesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe))
        gesture.direction = direction
        self.myView.addGestureRecognizer(gesture)// self.view
    }
}

@objc func handleSwipe(sender: UISwipeGestureRecognizer) {
    let direction = sender.direction
    switch direction {
        case .right:
            print("Gesture direction: Right")
        case .left:
            print("Gesture direction: Left")
        case .up:
            print("Gesture direction: Up")
        case .down:
            print("Gesture direction: Down")
        default:
            print("Unrecognized Gesture Direction")
    }
}

3

Hızlı Kaydırma Gesture içinde Swift 5

  override func viewDidLoad() {
    super.viewDidLoad()
    let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(handleGesture))
    swipeLeft.direction = .left
    self.view!.addGestureRecognizer(swipeLeft)

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

    let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(handleGesture))
    swipeUp.direction = .up
    self.view!.addGestureRecognizer(swipeUp)

    let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(handleGesture))
    swipeDown.direction = .down
    self.view!.addGestureRecognizer(swipeDown)
}

@objc func handleGesture(gesture: UISwipeGestureRecognizer) -> Void {
    if gesture.direction == UISwipeGestureRecognizer.Direction.right {
        print("Swipe Right")
    }
    else if gesture.direction == UISwipeGestureRecognizer.Direction.left {
        print("Swipe Left")
    }
    else if gesture.direction == UISwipeGestureRecognizer.Direction.up {
        print("Swipe Up")
    }
    else if gesture.direction == UISwipeGestureRecognizer.Direction.down {
        print("Swipe Down")
    }
}

2

Önce bir tane oluşturun baseViewControllerve viewDidLoadbu kodu "swift4" ekleyin :

class BaseViewController: UIViewController {             

     override func viewDidLoad() {
         super.viewDidLoad()
         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)
     }

     // Example Tabbar 5 pages
     @objc func swiped(_ gesture: UISwipeGestureRecognizer) {
         if gesture.direction == .left {
            if (self.tabBarController?.selectedIndex)! < 5 {
                self.tabBarController?.selectedIndex += 1
            }
         } else if gesture.direction == .right {
             if (self.tabBarController?.selectedIndex)! > 0 {
                 self.tabBarController?.selectedIndex -= 1
             }
         }
     }  
}

Ve bu baseControllersınıfı kullanın :

class YourViewController: BaseViewController {
    // its done. Swipe successful
    //Now you can use all the Controller you have created without writing any code.    
}

2

Swift 5'te,

let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe))
swipeGesture.direction = [.left, .right, .up, .down]
view.addGestureRecognizer(swipeGesture)

1

Nate'in cevabı için sadece daha havalı ve hızlı bir sözdizimi:

[UISwipeGestureRecognizerDirection.right,
 UISwipeGestureRecognizerDirection.left,
 UISwipeGestureRecognizerDirection.up,
 UISwipeGestureRecognizerDirection.down].forEach({ direction in
    let swipe = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
    swipe.direction = direction
    self.view.addGestureRecognizer(swipe)
 })

1

Kolay. Aşağıdaki kodu takip edin ve keyfini çıkarın.

//SwipeGestureMethodUsing
func SwipeGestureMethodUsing ()
{
    //AddSwipeGesture
    [UISwipeGestureRecognizerDirection.right,
     UISwipeGestureRecognizerDirection.left,
     UISwipeGestureRecognizerDirection.up,
     UISwipeGestureRecognizerDirection.down].forEach({ direction in
        let swipe = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
        swipe.direction = direction
        window?.addGestureRecognizer(swipe)
     })
}

//respondToSwipeGesture
func respondToSwipeGesture(gesture: UIGestureRecognizer) {

    if let swipeGesture = gesture as? UISwipeGestureRecognizer
    {
        switch swipeGesture.direction
        {
        case UISwipeGestureRecognizerDirection.right:
            print("Swiped right")
        case UISwipeGestureRecognizerDirection.down:
            print("Swiped down")
        case UISwipeGestureRecognizerDirection.left:
            print("Swiped left")
        case UISwipeGestureRecognizerDirection.up:
            print("Swiped up")
        default:
            break
        }
    }
}

1

Bir süre kazı yaptıktan sonra:

En kısa yolu için 4 yönde için hareketi yapmak üzere çalıştırılır eklemek geçerli:

override func viewDidLoad() {
    super.viewDidLoad()    
    for direction in [UISwipeGestureRecognizer.Direction.down, .up, .left, .right]{
        let swipeGest = UISwipeGestureRecognizer(target: self, action: #selector(swipeAction(_:)))
        swipeGest.direction = direction
        self.view.addGestureRecognizer(swipeGest)
    }
} 

@objc func swipeAction(_ gesture: UISwipeGestureRecognizer){
    switch gesture.direction {
    case UISwipeGestureRecognizer.Direction.right:
        print("Swiped right")
    case UISwipeGestureRecognizer.Direction.down:
        print("Swiped down")
    case UISwipeGestureRecognizer.Direction.left:
        print("Swiped left")
    case UISwipeGestureRecognizer.Direction.up:
        print("Swiped up")
    default: break
}

0

Tüm kaydırma UISwipeGestureRecognizer yönergelerinizi idare edecek bir işlev bildirerek basitçe yapılabilir. İşte kodum:

let swipeGestureRight = UISwipeGestureRecognizer(target: self, action:#selector(ViewController.respondToSwipeGesture(_:)) )
swipeGestureRight.direction = UISwipeGestureRecognizerDirection.right
self.view .addGestureRecognizer(swipeGestureRight)

let swipeGestureLeft = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeGestureLeft.direction = UISwipeGestureRecognizerDirection.left
self.view.addGestureRecognizer(swipeGestureLeft)

let swipeGestureUp = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeGestureUp.direction = UISwipeGestureRecognizerDirection.up
self.view.addGestureRecognizer(swipeGestureUp)

let swipeGestureDown = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeGestureDown.direction = UISwipeGestureRecognizerDirection.down
self.view.addGestureRecognizer(swipeGestureDown)

Kaydırma yönlendirme işlevini sağlayacak işlev şu şekildedir:

func respondToSwipeGesture(_ sender: UIGestureRecognizer) {
    if let swipeGesture = sender as? UISwipeGestureRecognizer {
        switch swipeGesture.direction {
            case UISwipeGestureRecognizerDirection.right:
                print("right swipe")
            case UISwipeGestureRecognizerDirection.left:
                print("leftSwipe")
            case UISwipeGestureRecognizerDirection.up:
                print("upSwipe")
            case UISwipeGestureRecognizerDirection.down:
                print("downSwipe")
            default:
                break
        }
    }
}

0

Aynen böyle: ( Swift 4.2.1 )

UISwipeGestureRecognizer.Direction.init(
  rawValue: UISwipeGestureRecognizer.Direction.left.rawValue |
            UISwipeGestureRecognizer.Direction.right.rawValue |
            UISwipeGestureRecognizer.Direction.up.rawValue |
            UISwipeGestureRecognizer.Direction.down.rawValue
)

2
Kodunuza bir açıklama ekleyin, lütfen daha iyi hale getirecektir.
Poul Bak

0

İçin Swift 5 güncellendiğinde

//Add in ViewDidLoad
let gesture = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.handleSwipe))
        gesture.direction = .right
        self.view.addGestureRecognizer(gesture)

//Add New Method
@objc func handleSwipe(sender: UISwipeGestureRecognizer) {
        print("swipe direction is",sender.direction)

    }

Bu, OP'nin sorusuna nasıl bir cevap? Sorun, kaydırma hareketi tanıyıcıya birden çok yön eklemenin zarif bir yolunu bulmaktı.
shashwat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.