2013-08-22 34 views
7

Tôi có một UIPanGuestureRecognizer thêm vào toàn bộ quan điểm sử dụng mã này:Nhận Vuốt sang Delete trên UITableView để làm việc với UIPanGestureRecognizer

UIPanGestureRecognizer *pgr = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)]; 
[[self view] addGestureRecognizer:pgr]; 

Trong giao diện chính Tôi có một UITableView trong đó có đoạn mã này để cho phép các swipe để tính năng xóa:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"RUNNING2"); 
    return UITableViewCellEditingStyleDelete; 
} 

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row >= _firstEditableCell && _firstEditableCell != -1) 
     NSLog(@"RUNNING1"); 
     return YES; 
    else 
     return NO; 
} 

Chỉ RUNNING1 được in vào nhật ký và nút Xóa không hiển thị. Tôi tin rằng lý do cho điều này là UIPanGestureRecognizer, nhưng tôi không chắc chắn. Nếu điều này là chính xác làm thế nào tôi nên đi về sửa chữa này. Nếu điều này không chính xác, vui lòng cung cấp nguyên nhân và sửa chữa. Cảm ơn.

+0

Bạn đã thiết lập lớp học của bạn là xem bảng của đại biểu? – rdelmar

+0

@rdelmar Có. Ngoài ra tôi không nghĩ rằng RUNNING1 sẽ được in nếu không. Nhưng cảm ơn vì đã cố gắng. – carloabelli

+2

canEditRorAtIndexPath: là một phương thức nguồn dữ liệu, không phải là phương thức ủy nhiệm, do đó nó sẽ chạy nếu bạn không thiết lập đại biểu. – rdelmar

Trả lời

13

Từ document:

Nếu một trình nhận dạng cử chỉ nhận ra cử chỉ của mình, chạm còn lại cho xem được hủy bỏ.

Trước tiên, bạn nhận dạng cử chỉ vuốt, vì vậy, UITableView không nhận được chạm nữa.

Để làm cho xem bảng nhận cảm ứng đồng thời với việc nhận dạng cử chỉ, thêm video này vào đại biểu cử chỉ nhận dạng của:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    return YES; 
} 
+0

Chính xác những gì tôi đang tìm kiếm. Hoạt động đẹp mắt. Cảm ơn! – carloabelli

+0

Hoàn hảo ... Hoạt động tuyệt vời ... – davidOhara

0

Nếu bạn đang sử dụng UIPanGuestureRecognizer ví dụ để hiển thị menu bên bạn có thể thấy một số tác dụng phụ không mong muốn khi bạn chỉ trả lại CÓ trong mọi trường hợp như được đề xuất trong câu trả lời được chấp nhận. Ví dụ menu bên mở khi bạn cuộn lên/xuống chế độ xem bảng (với rất ít hướng trái/phải) hoặc nút xóa hoạt động lạ khi bạn mở menu bên. Những gì bạn có thể muốn làm để ngăn chặn tác dụng phụ này là chỉ cho phép các cử chỉ ngang đồng thời. Điều này sẽ làm cho nút xóa hoạt động bình thường nhưng đồng thời các cử chỉ không mong muốn khác sẽ bị chặn khi bạn trượt menu.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) 
    { 
     UIPanGestureRecognizer *panGesture = (UIPanGestureRecognizer *)otherGestureRecognizer; 
     CGPoint velocity = [panGesture velocityInView:panGesture.view]; 
     if (ABS(velocity.x) > ABS(velocity.y)) 
      return YES; 
    } 
    return NO; 
} 

hoặc trong Swift:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    guard let panRecognizer = otherGestureRecognizer as? UIPanGestureRecognizer else { 
     return false 
    } 
    let velocity = panRecognizer.velocity(in: panRecognizer.view) 
    if (abs(velocity.x) > abs(velocity.y)) { 
     return true 
    } 
    return false 
} 
Các vấn đề liên quan