2013-02-25 19 views
5

Tôi có một tableviewCell, trong đó người dùng có thể scroll theo chiều ngang. Vì scrollView bao phủ gần như toàn bộ cell, phương thức tableViewdidSelectRow không được gọi nếu người dùng nhấp vào cell.UIScrollView bên trong một UITableViewCell - No didSelect gọi

Vì vậy, tôi nghĩ, tôi có thể vượt qua sự kiện chạm của UIScrollView đến cell, nhưng vẫn không được gọi là didSelectRow. Tôi subclassed UIScrollView để vượt qua các sự kiện liên lạc duy nhất, nếu các liên lạc không phải là một lực cản:

- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event 
{ 
    NSLog(@"touch scroll"); 
    // If not dragging, send event to next responder 
    if (!self.dragging) 
     [self.superview touchesEnded: touches withEvent:event]; 
    else 
     [super touchesEnded: touches withEvent: event]; 
} 

Bất kỳ ý tưởng về làm thế nào để vượt qua cú nhấp chuột để bàn, để có được các đại biểu-phương pháp gọi và giữ di chuyển bên trong scrollview?

+0

thử thiết userInteraction của xem cuộn kích hoạt. – rptwsthi

+0

Vì thao tác cuộn hoạt động tốt, các userInteractions đã được bật. – Grinarn

+0

Vâng Sau đó rút ngắn bộ cuộn của bạnXem AccerrraryButton để tiết lộ chi tiết và thực hiện nhiệm vụ mong muốn của bạn đã làmChọn đây. – rptwsthi

Trả lời

0

cố gắng thiết lập này

_scrollView.canCancelContentTouches = NO 

cũng có, nó là xấu để một phần phía trước chạm vào các sự kiện

+0

Điều này didnt giải quyết bất cứ điều gì, thật đáng buồn. – Grinarn

7

Tôi chỉ gặp phải cùng một vấn đề.
Trong lớp con của bạn chắc chắn để bao gồm toàn bộ các phương pháp:

-(void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (!self.dragging) 
     [self.superview touchesCancelled: touches withEvent:event]; 
    else 
     [super touchesCancelled: touches withEvent: event]; 
} 

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (!self.dragging) 
     [self.superview touchesMoved: touches withEvent:event]; 
    else 
     [super touchesMoved: touches withEvent: event]; 
} 

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (!self.dragging) 
     [self.superview touchesBegan: touches withEvent:event]; 
    else 
     [super touchesBegan: touches withEvent: event]; 
} 

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (!self.dragging) 
     [self.superview touchesEnded: touches withEvent:event]; 
    else 
     [super touchesEnded: touches withEvent: event]; 
} 
0

Câu trả lời được lựa chọn là đúng, nhưng tôi cập nhật mã dựa trên một lỗi tôi đã nhận được.

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (self.dragging) { 
     [super touchesMoved:touches withEvent:event]; 
    } else { 
     if ([self.delegate isKindOfClass:[UITableViewCell class]]) { 
      [(UITableViewCell *)self.delegate touchesCancelled:touches withEvent:event]; 
     } 

     [self.superview touchesMoved:touches withEvent:event]; 
    } 
} 

Nếu số self.delegate không phải là UITableViewCell, thay thế bất động sản đó bằng tài sản vào ô của bạn.

Ô cần truy xuất sự kiện chạm hủy trong khi di chuyển để ngăn các kết quả không mong muốn. Nó có thể dễ dàng tái sản xuất như sau.

  • Highlight tế bào (giả xem di chuyển là trên toàn bộ tế bào, nếu không làm nổi bật quan điểm cuộn)
  • Trong khi các tế bào được đánh dấu, kéo xem bảng
  • Chọn bất kỳ tế bào khác và bây giờ ô được đánh dấu trước đó sẽ truy xuất trạng thái didSelectCell

Một điểm khác cần lưu ý là thứ tự quan trọng! Nếu self.delegate không được gọi trước self.superview thì trạng thái được đánh dấu sẽ không xảy ra.

11

Bạn thực sự có thể thực hiện việc này mà không cần phân lớp UIScrollView. Cho dù bạn có một tế bào tùy chỉnh, hoặc đang thiết lập các thuộc tính trong cellForRowAtIndexPath trong UITableView, bạn có thể làm như sau:

[cell.contentView addSubview:yourScrollView]; 
yourScrollView.userInteractionEnabled = NO; 
[cell.contentView addGestureRecognizer:yourScrollView.panGestureRecognizer]; 

Lý do bạn có thể làm điều này là bởi vì scrollview có panGestureRecognizer riêng của mình đó là truy cập đến các lập trình viên. Vì vậy, chỉ cần thêm nó vào khung nhìn của ô sẽ kích hoạt các cử chỉ cử chỉ của scrollview.

Hạn chế duy nhất của phương pháp này là các bản xem trước của chế độ xem cuộn không thể nhận được bất kỳ đầu vào cảm ứng nào. Nếu bạn cần điều này, bạn sẽ phải chọn một cách tiếp cận khác.

0

Swift 3

scrollView.isUserInteractionEnabled = false 
contentView.addGestureRecognizer(scrollView.panGestureRecognizer) 
Các vấn đề liên quan