Hareket Tanıyıcılar
Görünümünüze bir Hareket Tanıyıcı eklediğinizde size bildirilebilecek bir dizi yaygın olarak kullanılan dokunma etkinliği (veya jest) vardır . Aşağıdaki hareket türlerini varsayılan olarak destekliyorlar:
UITapGestureRecognizer
Simgesine dokunun (ekrana kısa bir veya birkaç kez dokunun )
UILongPressGestureRecognizer
Uzun dokunma (ekrana uzun süre dokunma)
UIPanGestureRecognizer
Kaydırma (parmağınızı ekran boyunca hareket ettirme)
UISwipeGestureRecognizer
Kaydırma (parmağınızı hızla hareket ettirme)
UIPinchGestureRecognizer
Sıkıştırma (iki parmağınızı birlikte veya birbirinden uzaklaştırma - genellikle yakınlaştırmak için)
UIRotationGestureRecognizer
Döndürme (iki parmağınızı dairesel yönde hareket ettirme)
Bunlara ek olarak, kendi özel hareket tanımanızı da yapabilirsiniz.
Arayüz Oluşturucuya Hareket Ekleme
Bir hareket tanıyıcıyı nesne kitaplığından görünümünüze sürükleyin.
Çıkış ve İşlem yapmak için Belge Anahatındaki hareketten Görünüm Denetleyici kodunuza sürüklemeyi kontrol edin.
Bu varsayılan olarak ayarlanmalıdır, ancak görünümünüz için Kullanıcı İşlemi Etkin öğesinin true olarak ayarlandığından emin olun .
Programlı Bir Hareket Ekleme
Programlı bir hareket eklemek için, (1) bir hareket tanıyıcı oluşturursunuz, (2) bir görünüme eklersiniz ve (3) hareket tanınırken çağrılan bir yöntem yaparsınız.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var myView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
// 1. create a gesture recognizer (tap gesture)
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:)))
// 2. add the gesture recognizer to a view
myView.addGestureRecognizer(tapGesture)
}
// 3. this method is called when a tap is recognized
@objc func handleTap(sender: UITapGestureRecognizer) {
print("tap")
}
}
notlar
sender
Parametre isteğe bağlıdır. Jest için bir referansa ihtiyacınız yoksa, dışarıda bırakabilirsiniz. Ancak bunu yaparsanız (sender:)
, işlem sonrası yöntem adını kaldırın .
handleTap
Yöntemin adlandırılması keyfiydi. Kullanmak istediğiniz her şeyi adlandırın .action: #selector(someMethodName(sender:))
Daha fazla örnek
Nasıl çalıştıklarını görmek için bu görünümlere eklediğim jest tanıyıcıları inceleyebilirsiniz.
İşte bu proje için kod:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var tapView: UIView!
@IBOutlet weak var doubleTapView: UIView!
@IBOutlet weak var longPressView: UIView!
@IBOutlet weak var panView: UIView!
@IBOutlet weak var swipeView: UIView!
@IBOutlet weak var pinchView: UIView!
@IBOutlet weak var rotateView: UIView!
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Tap
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))
tapView.addGestureRecognizer(tapGesture)
// Double Tap
let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap))
doubleTapGesture.numberOfTapsRequired = 2
doubleTapView.addGestureRecognizer(doubleTapGesture)
// Long Press
let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(gesture:)))
longPressView.addGestureRecognizer(longPressGesture)
// Pan
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(gesture:)))
panView.addGestureRecognizer(panGesture)
// Swipe (right and left)
let swipeRightGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(gesture:)))
let swipeLeftGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(gesture:)))
swipeRightGesture.direction = UISwipeGestureRecognizerDirection.right
swipeLeftGesture.direction = UISwipeGestureRecognizerDirection.left
swipeView.addGestureRecognizer(swipeRightGesture)
swipeView.addGestureRecognizer(swipeLeftGesture)
// Pinch
let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(gesture:)))
pinchView.addGestureRecognizer(pinchGesture)
// Rotate
let rotateGesture = UIRotationGestureRecognizer(target: self, action: #selector(handleRotate(gesture:)))
rotateView.addGestureRecognizer(rotateGesture)
}
// Tap action
@objc func handleTap() {
label.text = "Tap recognized"
// example task: change background color
if tapView.backgroundColor == UIColor.blue {
tapView.backgroundColor = UIColor.red
} else {
tapView.backgroundColor = UIColor.blue
}
}
// Double tap action
@objc func handleDoubleTap() {
label.text = "Double tap recognized"
// example task: change background color
if doubleTapView.backgroundColor == UIColor.yellow {
doubleTapView.backgroundColor = UIColor.green
} else {
doubleTapView.backgroundColor = UIColor.yellow
}
}
// Long press action
@objc func handleLongPress(gesture: UILongPressGestureRecognizer) {
label.text = "Long press recognized"
// example task: show an alert
if gesture.state == UIGestureRecognizerState.began {
let alert = UIAlertController(title: "Long Press", message: "Can I help you?", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated: true, completion: nil)
}
}
// Pan action
@objc func handlePan(gesture: UIPanGestureRecognizer) {
label.text = "Pan recognized"
// example task: drag view
let location = gesture.location(in: view) // root view
panView.center = location
}
// Swipe action
@objc func handleSwipe(gesture: UISwipeGestureRecognizer) {
label.text = "Swipe recognized"
// example task: animate view off screen
let originalLocation = swipeView.center
if gesture.direction == UISwipeGestureRecognizerDirection.right {
UIView.animate(withDuration: 0.5, animations: {
self.swipeView.center.x += self.view.bounds.width
}, completion: { (value: Bool) in
self.swipeView.center = originalLocation
})
} else if gesture.direction == UISwipeGestureRecognizerDirection.left {
UIView.animate(withDuration: 0.5, animations: {
self.swipeView.center.x -= self.view.bounds.width
}, completion: { (value: Bool) in
self.swipeView.center = originalLocation
})
}
}
// Pinch action
@objc func handlePinch(gesture: UIPinchGestureRecognizer) {
label.text = "Pinch recognized"
if gesture.state == UIGestureRecognizerState.changed {
let transform = CGAffineTransform(scaleX: gesture.scale, y: gesture.scale)
pinchView.transform = transform
}
}
// Rotate action
@objc func handleRotate(gesture: UIRotationGestureRecognizer) {
label.text = "Rotate recognized"
if gesture.state == UIGestureRecognizerState.changed {
let transform = CGAffineTransform(rotationAngle: gesture.rotation)
rotateView.transform = transform
}
}
}
notlar
- Tek bir görünüme birden fazla hareket tanıyıcı ekleyebilirsiniz. Basitlik uğruna, bunu yapmadım (kaydırma hareketi hariç). Projeniz için gerekiyorsa, jest tanıyıcı belgelerini okumalısınız . Oldukça anlaşılabilir ve yararlı.
- Yukarıdaki örneklerimle ilgili bilinen sorunlar: (1) Yatay kaydırma görünümü, sonraki hareket etkinliğinde çerçevesini sıfırlar. (2) Kaydırma görünümü, ilk kaydırmada yanlış yönden gelir. (Örneklerimdeki bu hatalar, Hareket Tanıyıcıların nasıl çalıştığına ilişkin anlayışınızı etkilememelidir.)