UIGestureRecognizer บล็อกการเลื่อนมุมมองตาราง

ฉันใช้คลาสย่อย UIGestureRecognizer ที่กำหนดเองเพื่อติดตามท่าทางในคลาส InfoView ของฉัน คลาส InfoView เป็นมุมมองย่อยของคลาสย่อย UITableViewCell แบบกำหนดเองที่เรียกว่า InfoCell

ฉันได้เพิ่มการรู้จำท่าทางของฉันในมุมมองรูทของฉัน (มุมมองพาเรนต์ของทุกสิ่งบนหน้าจอ เนื่องจากจุดประสงค์ของการรู้จำท่าทางที่กำหนดเองของฉันคือการอนุญาตให้ลาก InfoCell มุมมองระหว่างตาราง) ตอนนี้ทุกอย่างทำงานได้ตามปกติยกเว้นสิ่งเดียว ฉันใช้รหัสต่อไปนี้ในคลาสย่อย UIGestureRecognizer ของฉันเพื่อตรวจจับการสัมผัสในมุมมอง InfoView:

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

ปัญหาที่นี่คือการสัมผัสบนวัตถุ InfoView กำลังถูกดัก ดังนั้นการแตะเหล่านั้นจึงไม่ถูกส่งต่อไปยัง UITableView ซึ่งมี InfoCell ซึ่งเป็นมุมมองหลักของ InfoView ซึ่งหมายความว่าฉันไม่สามารถเลื่อนมุมมองตารางโดยการลากบนมุมมอง InfoView ได้อีกต่อไป ซึ่งเป็นปัญหาเนื่องจาก InfoView ครอบคลุมทั้ง InfoCell

มีวิธีใดบ้างที่ฉันสามารถส่งต่อการสัมผัสไปยังมุมมองตารางเพื่อให้สามารถเลื่อนได้ ฉันได้ลองหลายอย่างแล้ว:

[super touchesBegan:touches withEvent:event];

[touchView.superview.superview touchesBegan:touches withEvent:event]; (touchView.superview.superview ได้รับการอ้างอิงถึงพาเรนต์ UITableView)

แต่จนถึงขณะนี้ก็ยังไม่มีอะไรทำงาน นอกจากนี้ คุณสมบัติ cancelsTouchesInView ของ UIGestureRecognizer ของฉันยังถูกตั้งค่าเป็น NO เพื่อไม่ให้รบกวนการสัมผัส

ขอขอบคุณความช่วยเหลือ ขอบคุณ!


person indragie    schedule 20.07.2010    source แหล่งที่มา


คำตอบ (4)


ลองดูวิธี UIGestureRecognizerDelegate: - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

หากสิ่งนี้ส่งคืน YES มันจะป้องกันไม่ให้ตัวจดจำท่าทางของคุณกระทืบอันที่ UIScrollView ใช้เพื่อตรวจจับการเลื่อน

person Mark Adams    schedule 29.10.2010
comment
ฉันเอาหัวโขกกำแพงกับสิ่งนี้ ขอบคุณ ! :D - person Legolas; 31.08.2012

UIGestureRecognizer มีคุณสมบัติ "cancelsTouchesInView" ซึ่งตั้งค่าเป็น YES ตามค่าเริ่มต้น ซึ่งหมายความว่าการสัมผัสใน UIView จะถูกยกเลิกเมื่อจดจำท่าทางสัมผัสได้ ลองตั้งค่าเป็น NO เพื่อให้ UIScrollView รับกิจกรรมการสัมผัสเพิ่มเติม

person Felix    schedule 30.07.2010

ฉันมีบรรทัดในวิธี touchesBegan ที่ตั้งค่าคุณสมบัติ state ของการจดจำท่าทางเป็น UIGestureRecognizerStateBegan การลบบรรทัดนี้ดูเหมือนจะแก้ไขปัญหาได้

person indragie    schedule 21.07.2010

คุณสามารถลองเพิ่มการแจ้งเตือนนี้

- (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
นี่คือคำตอบที่ถูกต้อง ป้องกันไม่ให้ panGesture เริ่มต้นหากท่าทางอยู่ในแนวตั้ง - person Vassily; 11.04.2014