UIGestureRecognizer memblokir tampilan tabel yang bergulir

Saya menggunakan subkelas UIGestureRecognizer khusus untuk melacak gerakan di kelas InfoView saya. Kelas InfoView adalah subview dari subkelas UITableViewCell khusus yang disebut InfoCell.

Saya telah menambahkan pengenal isyarat saya ke tampilan root saya (tampilan induk dari segala sesuatu yang lain di layar, karena tujuan pengenal isyarat khusus saya adalah untuk memungkinkan menyeret InfoCell tampilan antar tabel). Sekarang, semuanya berjalan sebagaimana mestinya kecuali satu hal. Saya menggunakan kode berikut di subkelas UIGestureRecognizer saya untuk mendeteksi sentuhan pada tampilan InfoView:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UIView *touchView = [[touches anyObject] view];
    if ([touchView isKindOfClass:[InfoView class]]) {
        // Do stuff
    }

Masalahnya disini adalah sentuhan pada objek InfoView dicegat, oleh karena itu sentuhan tersebut tidak diteruskan ke UITableView yang berisi InfoCell, yang merupakan tampilan induk dari InfoView. Ini berarti saya tidak dapat lagi menggulir tampilan tabel dengan menyeret tampilan InfoView, yang merupakan masalah karena InfoView menutupi seluruh InfoCell.

Adakah cara agar saya dapat meneruskan sentuhan ke tampilan tabel agar dapat digulir? Saya sudah mencoba banyak hal:

[super touchesBegan:touches withEvent:event];

[touchView.superview.superview touchesBegan:touches withEvent:event]; (touchView.superview.superview mendapat referensi ke induknya UITableView)

Namun sejauh ini tidak ada yang berhasil. Selain itu, properti cancelsTouchesInView dari UIGestureRecognizer saya disetel ke NO, sehingga tidak mengganggu sentuhan.

Bantuan dihargai. Terima kasih!


person indragie    schedule 20.07.2010    source sumber


Jawaban (4)


Lihat metode UIGestureRecognizerDelegate: - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

Jika ini mengembalikan YA, ini akan mencegah pengenal isyarat Anda menginjak salah satu yang digunakan UIScrollView untuk mendeteksi pengguliran.

person Mark Adams    schedule 29.10.2010
comment
Saya telah membenturkan kepala saya ke dinding dalam hal ini. Terima kasih ! :D - person Legolas; 31.08.2012

UIGestureRecognizer memiliki properti "cancelsTouchesInView" yang disetel ke YES secara default. Ini berarti sentuhan di UIView dibatalkan ketika isyarat dikenali. Cobalah untuk mengaturnya ke NO agar UIScrollView menerima peristiwa sentuh lebih lanjut.

person Felix    schedule 30.07.2010

Saya memiliki baris dalam metode touchesBegan saya yang menyetel properti state dari pengenal isyarat ke UIGestureRecognizerStateBegan. Menghapus baris ini sepertinya menyelesaikan masalah.

person indragie    schedule 21.07.2010

Anda dapat mencoba menambahkan notifikasi ini

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if ([gestureRecognizer class] == [UIPanGestureRecognizer class]) {
        UIPanGestureRecognizer *panGestureRec = (UIPanGestureRecognizer *)gestureRecognizer;
        CGPoint point = [panGestureRec velocityInView:self];
        if (fabsf(point.x) > fabsf(point.y) ) {
            return YES;
        }
    }
    return NO;
}
person user2182192    schedule 28.08.2013
comment
ini adalah jawaban yang benar, cegah panGesture untuk memulai jika gerakannya vertikal. - person Vassily; 11.04.2014