Muszę użyć przesunięcia, aby rozpoznać gest przesunięcia w dół, a następnie w prawo. Ale na szybkim UISwipeGestureRecognizer ma z góry określony Właściwy kierunek .. I nie wiem, jak to zrobić, aby użyć innych kierunków.
132
Musisz mieć jeden UISwipeGestureRecognizer
dla każdego kierunku. To trochę dziwne, ponieważ ta UISwipeGestureRecognizer.direction
właściwość jest maską bitową w stylu opcji, ale każdy aparat rozpoznający może obsługiwać tylko jeden kierunek. Jeśli chcesz, możesz wysłać je wszystkie do tego samego handlera i tam załatwić lub wysłać do różnych handlerów. Oto jedna implementacja:
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
}
}
}
UISwipeGestureRecognizerDirection
przed.Down
ect. Wystarczy użyć,swipeDown.direction = .Down
jeśli wystarczy. Tylko wskazówka =)swipe.direction = [.Right,.Down,.Up,.Left]
), aparat rozpoznawania nie zostanie nawet wywołany, być może jest to problem ze swift, ale w tej chwili nie działa.Po prostu poczułem, że mam coś do zrobienia, w końcu wygląda bardziej elegancko:
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) }
źródło
self.addGestureRecognizer(gesture)
spowodował dla mnie błąd. Naprawiono toself.view.addGestureRecognizer(gesture);
.UIView
podklasie, ale masz absolutną rację, jeśli jesteś wUIViewController
!Z serii ujęć:
Z Twojego widokuController:
@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") }
źródło
Wygląda na to, że ostatnio coś się zmieniło. W XCode 7.2 działa następujące podejście:
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) }
Testowano w symulatorze na iOS 8.4 i 9.2 oraz na rzeczywistym urządzeniu w wersji 9.2.
Lub korzystając z przydatnego rozszerzenia mlcollard tutaj :
let swipeGesture = UISwipeGestureRecognizer() { print("Gesture recognized !") } swipeGesture.direction = [.Down, .Up] self.view.addGestureRecognizer(swipeGesture)
źródło
[UISwipeGestureRecognizerDirection.right, .left, .up, .down]
Apple Swift w wersji 3.1 - Xcode w wersji 8.3 (8E162)
Wygodne podejście od podejścia Alexandre Cassagne
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") } }
źródło
defaults write com.apple.dt.xcode IDEPlaygroundDisableSimulatorAlternateFramebuffer -bool YES
w Terminalu, aby naprawić błąd na jakimś sprzęcie. Należy to naprawić w nowej wersji XcodeW Swift 4.2 i Xcode 9.4.1
Dodaj delegata animacji, CAAnimationDelegate do swojej klasy
//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. }) }
Jeśli chcesz usunąć gest z widoku, użyj tego kodu
self.transparentView.removeGestureRecognizer(gesture)
Dawny:
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) } } } } }
Wywołaj tę funkcję jak
//Remove swipe gesture self.willMoveFromView(view: self.transparentView)
W ten sposób możesz napisać pozostałe wskazówki i uważać, czy masz widok przewijania, czy nie, od dołu do góry i odwrotnie
Jeśli masz widok przewijania, pojawi się konflikt między gestami od góry do dołu i odwrotnie.
źródło
UISwipeGestureRecognizer
madirection
właściwość, która ma następującą definicję:var direction: UISwipeGestureRecognizerDirection
Problem z Swift 3.0.1 (i niższymi) polega na tym, że nawet jeśli
UISwipeGestureRecognizerDirection
jest zgodny zOptionSet
, poniższy fragment zostanie skompilowany, ale nie przyniesie żadnego pozytywnego oczekiwanego wyniku:// This compiles but does not work let gesture = UISwipeGestureRecognizer(target: self, action: #selector(gestureHandler)) gesture.direction = [.right, .left, .up, .down] self.addGestureRecognizer(gesture)
Aby obejść ten problem, musisz utworzyć
UISwipeGestureRecognizer
dla każdego pożądanego plikudirection
.Poniższy kod Playground pokazuje, jak zaimplementować kilka
UISwipeGestureRecognizer
dla tego samegoUIView
i tego samegoselector
przy użyciumap
metody Array :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
źródło
UISwipeGestureRecognizerDirection(rawValue: 15)
Przesuń gest do żądanego widoku lub całego widoku kontrolera widoku w Swift 5 i XCode 11 w oparciu o @Alexandre Cassagne
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") } }
źródło
Gest machnięcia w 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") } }
źródło
Najpierw utwórz
baseViewController
i dodajviewDidLoad
ten kod „swift4”: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 } } } }
I użyj tej
baseController
klasy:class YourViewController: BaseViewController { // its done. Swipe successful //Now you can use all the Controller you have created without writing any code. }
źródło
W Swift 5
let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe)) swipeGesture.direction = [.left, .right, .up, .down] view.addGestureRecognizer(swipeGesture)
źródło
Po prostu fajniejsza, szybka składnia odpowiedzi Nate'a:
[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) })
źródło
Łatwy. Po prostu postępuj zgodnie z poniższym kodem i ciesz się.
//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 } } }
źródło
Po dłuższej zabawie:
Najkrótsza droga do dodania swipes dla wszystkich 4 kierunkach jest:
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 }
źródło
Można to zrobić, po prostu deklarując jedną funkcję, która będzie obsługiwać wszystkie wskazówki dotyczące machnięcia UISwipeGestureRecognizer. Oto mój kod:
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)
Oto funkcja, która będzie obsługiwać funkcję przesuwania:
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 } } }
źródło
Tak po prostu: ( Swift 4.2.1 )
UISwipeGestureRecognizer.Direction.init( rawValue: UISwipeGestureRecognizer.Direction.left.rawValue | UISwipeGestureRecognizer.Direction.right.rawValue | UISwipeGestureRecognizer.Direction.up.rawValue | UISwipeGestureRecognizer.Direction.down.rawValue )
źródło
W przypadku Swift 5 został zaktualizowany
//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) }
źródło