Как распознать салфетки во всех 4 направлениях
Мне нужно использовать салфетки, чтобы распознать жест вниз, а затем вправо. Но на swift UISwipeGestureRecognizer имеет предопределить правильное направление.. И я не знаю, как сделать это для других направлений..
11 ответов:
вы должны иметь один
UISwipeGestureRecognizer
для каждого направления. Это немного странно, потому чтоUISwipeGestureRecognizer.direction
свойство-это битовая маска стиля опций, но каждый распознаватель может обрабатывать только одно направление. Вы можете отправить их все в тот же обработчик, если хотите, и отсортировать его там, или отправить их в разные обработчики. Вот одна реализация:override func viewDidLoad() { super.viewDidLoad() var swipeRight = UISwipeGestureRecognizer(target: self, action: "respondToSwipeGesture:") swipeRight.direction = UISwipeGestureRecognizerDirection.Right self.view.addGestureRecognizer(swipeRight) var swipeDown = UISwipeGestureRecognizer(target: self, action: "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 } } }
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 } } }
Я просто хотел внести свой вклад, выглядит более элегантно в конце концов:
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) }
раскадровка:
- добавьте четыре распознавателя жестов салфетки к вашему виду.
- установите каждый из них с целевым направлением из инспектора атрибутов. Вы можете выберите вправо, влево, вверх или вниз
- один за другим, выберите распознаватель жестов салфетки, управление + перетащите на контроллер вида. Вставьте имя (скажем, leftGesture, rightGesture, upGesture и downGesture), измените соединение на: действие и тип к: UISwipeGestureRecognizer
от вашего viewController:
@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") }
похоже, в последнее время все изменилось. В XCode 7.2 работает следующий подход:
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) }
протестировано в симуляторе на iOS 8.4 и 9.2 и на реальном устройстве на 9.2.
или mlcollard's удобно здесь:
let swipeGesture = UISwipeGestureRecognizer() { print("Gesture recognized !") } swipeGesture.direction = [.Down, .Up] self.view.addGestureRecognizer(swipeGesture)
Apple Swift версии 3.1-Xcode версии 8.3 (8E162)
удобный способ от подход Александра Кассаня
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") } }
UISwipeGestureRecognizer
естьdirection
свойство, которое имеет следующее определение:var direction: UISwipeGestureRecognizerDirection
разрешенное направление свайпа для этого распознавателя жестов.
проблема с Swift 3.0.1 (и ниже) заключается в том, что даже если
UISwipeGestureRecognizerDirection
соответствуетOptionSet
, следующий фрагмент будет компилироваться, но не даст никакого положительного ожидаемого результата:// This compiles but does not work let gesture = UISwipeGestureRecognizer(target: self, action: #selector(gestureHandler)) gesture.direction = [.right, .left, .up, .down] self.addGestureRecognizer(gesture)
в качестве обходного пути, вы должны создайте
UISwipeGestureRecognizer
для каждогоdirection
.
следующий код игровой площадки показывает, как реализовать несколько
UISwipeGestureRecognizer
за то же самоеUIView
и то жеselector
использование массиваmap
способ: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 = 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
в Swift 4.1 и Xcode 9.4.1
добавить делегат анимации,CAAnimationDelegate в свой класс
//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) }) } //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) }) }
Как это вы можете написать остальные направления и, пожалуйста, будьте осторожны, если у вас есть прокрутите вид или нет снизу вверх и наоборот
создать
baseViewController
и добавитьviewDidLoad
это код "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 } } } }
и использовать этот
baseController
класс:class YourViewController: BaseViewController { // its done. Swipe successful //Now you can use all the Controller you have created without writing any code. }
просто более крутой синтаксис swift для ответа Нейта:
[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) })
Это можно сделать, просто объявив одну функцию, которая будет обрабатывать все ваши направления салфетки UISwipeGestureRecognizer. Вот мой код:
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)
вот функция, которая будет hande функциональность swipedirection:
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 } } }
легко. Просто следуйте приведенному ниже коду и наслаждайтесь.
//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 } } }