Saya memiliki tampilan yang memiliki UIPanGestureRecognizer
untuk menyeret tampilan secara vertikal. Jadi dalam callback pengenal, saya hanya memperbarui koordinat y untuk memindahkannya. Superview tampilan ini, memiliki UIPanGestureRecognizer
yang akan menyeret tampilan secara horizontal, hanya memperbarui koordinat x.
Masalahnya adalah yang pertama UIPanGestureRecognizer
adalah mengambil acara untuk memindahkan tampilan secara vertikal, jadi saya tidak bisa menggunakan gerakan superview.
saya telah mencoba
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:
(UIGestureRecognizer *)otherGestureRecognizer;
dan keduanya akan bekerja, tetapi saya tidak menginginkannya. Saya ingin secara horizontal terdeteksi hanya jika gerakannya jelas horisontal. Jadi akan lebih bagus jika UIPanGestureRecognizer
memiliki properti arah.
Bagaimana saya bisa mencapai perilaku ini? Saya menemukan dokumen sangat membingungkan, jadi mungkin seseorang dapat menjelaskannya dengan lebih baik di sini.
sumber
Jawaban:
Lakukan saja ini untuk pengenal isyarat pan vertikal, ini berfungsi untuk saya:
Dan untuk Swift:
sumber
velocityInView
bukantranslationInView
.Saya menciptakan solusi dengan subclassing seperti pada jawaban yang disediakan @LocoMike, tetapi menggunakan mekanisme pendeteksian yang lebih efektif melalui kecepatan awal seperti yang disediakan oleh @Hejazi. Saya juga menggunakan Swift, tetapi ini harus mudah diterjemahkan ke Obj-C jika diinginkan.
Keuntungan dibandingkan solusi lain:
Berikut kodenya:
Contoh penggunaan:
sumber
UIPanGestureRecognizer
.let horizontalPanRecognizer = PanDirectionGestureRecognizer(direction: .horizontal, target: self, action: #selector(handleHorizontalPanGesture(recognizer:))) self.view?.addGestureRecognizer(horizontalPanRecognizer); let verticalPanRecognizer = PanDirectionGestureRecognizer(direction: .vertical, target: self, action: #selector(handleVerticalPanGesture(recognizer:))) self.view?.addGestureRecognizer(verticalPanRecognizer);
Saya menemukan cara membuat subclass dari UIPanGestureRecognizer
DirectionPanGestureRecognizer:
DirectionPanGestureRecognizer.m:
Ini hanya akan memicu gerakan jika pengguna mulai menyeret dalam perilaku yang dipilih. Tetapkan properti arah ke nilai yang benar dan Anda sudah siap.
sumber
initWithTarget:action:
metode dan disebut reset dan semuanya baik-baik saja.DirectionPanGestureRecognizer
akan mengabaikan drag cepat, kecuali jika Anda mengaturkDirectionPanThreshold = 20
atau lebih, dalam hal ini dapat memberikan alarm palsu. Saya menyarankan untuk meletakkan danabs(_moveX) > abs(_moveY)
bukannyaabs(_moveX) > kDirectionPanThreshold
mengganti kasus horizontal masing-masing._drag = YES
saya tambahkanself.state = UIGestureRecognizerStateChanged;
Saya mencoba membatasi area yang valid secara horizontal dengan UIPanGestureRecognizer.
Kemudian, hanya menggesek dalam ambang batas derajat secara horizontal dapat memicu gerakan panci ini.
sumber
Swift 3.0 menjawab: hanya menangani gerakan vertikal
sumber
Solusi berikut memecahkan masalah saya:
Ini sebenarnya hanya memeriksa apakah pan terjadi pada tampilan utama atau tableView.
sumber
Versi 3 jawaban Lee cepat untuk yang malas
sumber
Aku mengambil Lee Goodrich 's jawaban dan diperpanjang seperti aku butuh khusus arah pan tunggal. Gunakan seperti ini:
let pan = PanDirectionGestureRecognizer(direction: .vertical(.up), target: self, action: #selector(handleCellPan(_:)))
Saya juga menambahkan beberapa komentar untuk membuatnya sedikit lebih jelas keputusan apa yang sebenarnya dibuat.
sumber
override func touchesMoved
-Method does not override any method from its superclass
.Anda dapat menemukan arah yang diseret
UIView
melaluiUIPanGestureRecognizer
. Silakan ikuti kodenya.sumber
Cepat 4.2
Solusinya adalah hanya untuk mendukung gerakan panci secara vertikal, sama seperti horizontal.
Solusi 1 :
Solusi 2:
Kemudian gerakan menggesek akan menelan gerakan panci. Tentu saja, Anda tidak perlu melakukan apa pun
swipeAction
.sumber
Inilah cara saya mengatasinya:
Pertama-tama saya mengaktifkan Pengenalan PanGesture secara bersamaan.
Kemudian saya mengisolasi gerakan Pan Horisontal dan Vertikal (akumulator adalah properti NSMutableArray):
Saya mendorong sebuah contoh di sini:
tambahkan custom pan di scrollview
sumber
sumber
Anda dapat menggunakan yang sederhana
panGestureRecognizer
. Tidak perlu menggunakanpandirectionregognizer
atau barang-barang. Cukup gunakan nilai y dari HanyatranslationInview
tarik kode tarik tampilan di atas dan ke bawahsumber
Saya membuat metode tindakan PanGestureRecognizer @selector untuk objek yang hanya membutuhkan pengguliran horizontal.
sumber
Cara cepat
sumber
Untuk semua Anda pengguna Swift di luar sana, ini akan melakukan pekerjaan :)
sumber
Saya mengambil jawaban yang sangat baik oleh Lee Goodrich dan pindah ke Swift 3
sumber
Saya ingin membagikan pendekatan saya karena semua pendekatan lain didasarkan pada salah satu
UIGestureRecognizerDelegate
atau subklasifikasiUIPanGestureRecognizer
.Pendekatan saya didasarkan pada runtime dan swizzling. Saya tidak 100% yakin tentang pendekatan ini, tetapi Anda dapat menguji dan memperbaikinya sendiri.
Tetapkan arah apa pun
UIPanGestureRecognizer
hanya dengan satu baris kode:gunakan
pod 'UIPanGestureRecognizerDirection'
atau kode:sumber
Saya mencoba ini: yang bekerja untuk saya sesuai dengan pertanyaan yang dijelaskan
sumber
SWIFT 4.2
Saya melangkah lebih jauh dan membuat arah Pan Gesture:
(Digunakan: https://github.com/fastred/SloppySwiper dan https://stackoverflow.com/a/30607392/5790492 )
sumber
Ini adalah gerakan pan kustom di Swift 5
Anda dapat membatasi arah dan sudut maks dalam arah, Anda juga dapat membatasi kecepatan minimum dalam arah.
sebut seperti ini:
atau
sumber
PanGestureRecognizer
antarmuka berisi definisi berikut:Saya tidak memeriksa ini, tetapi mungkin dapat diakses melalui subkelas.
sumber