2012-04-17 32 views
7

Tôi có UITableView đơn giản với 4 hàng, mỗi hàng có chiều cao là 50. Khi tôi nhấn hàng thứ tư, tôi chèn hàng thứ năm với chiều cao là 80 sử dụng UITableViewRowAnimationTop. Càng xa càng tốt.Hoạt ảnh trông khó xử khi xóa ô có chiều cao lớn hơn các ô khác

Tôi muốn xóa hàng thứ năm khi hàng thứ tư được nhấn lần nữa. Nhưng khi tôi xóa hàng bằng cách sử dụng UITableViewRowAnimationTop (hoặc bất kỳ kiểu hoạt ảnh nào khác cho vấn đề đó), hoạt ảnh trông rất khó xử - hoạt ảnh bắt đầu nhưng ô biến mất đột ngột trước khi hoạt ảnh hoàn tất. (Điều này chỉ rõ ràng khi bạn đang sử dụng các ô có màu nền. Bạn có thể thấy nửa dưới của ô đột nhiên biến mất thay vì biến mất trong ô bên trên ô.)

Mã này giống như sau:

[self.tableview beginupdates]; 
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop]; 
[self.tableview endupdates]; 

Chiều cao hàng được cung cấp theo phương pháp tableView:heightForRowAtIndexPath:.

Sự cố này không xảy ra khi tất cả các hàng có cùng chiều cao hoặc khi hàng bị xóa ngắn hơn các hàng khác.

Tôi nghĩ một workaround là thay đổi chiều cao của các tế bào thứ năm đến 50 trước khi xóa nó, nhưng tôi không muốn làm that.Please giúp

Trả lời

0

bạn đã cố gắng làm điều đó mà không bắt đầu/endUpdates? Tôi mơ hồ nhớ lại bằng cách làm những điều kỳ lạ một lần.

Bạn đã thử thực hiện reloadRowsAtIndexPaths: cho hàng tiếp theo? Giả sử có một, đó là.

Bạn có chắc chắn nguồn dữ liệu hoạt động chính xác theo điều kiện của heightForRow phản hồi tại thời điểm bạn thực hiện lệnh gọi deleteRowsAt không? (ví dụ: bạn có thể đặt một số cờ để biểu thị điều không hiển thị nữa sau khi cuộc gọi xóa có thể dẫn đến hàng mới có chiều cao không tốt)

1

Tôi vừa gặp vấn đề này sáng nay. Về cơ bản, tôi đã tự mình xử lý hoạt ảnh, sau đó xóa ô sau khi hoàn thành hoạt ảnh. Dưới đây là một số mã để cho thấy cách tôi đã làm điều đó:

@property (nonatomic, strong) NSArray *tableData; 
@property (nonatomic, strong) NSMutableDictionary *deletedItems; 
... 

- (void)deleteItemForCell:(UITableViewCell *)cell 
{ 
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
    NSObject *item = self.tableData[indexPath.row]; 

    NSNumber *rowKey = @(indexPath.row); 

    __weak id weakSelf = self; 
    [CATransaction setCompletionBlock:^{ 
     @synchronized(weakSelf) { 
      [self.deletedItems removeObjectForKey:rowKey]; 
      [self.tableData removeObject:item]; 
      [self.tableView deleteRowsAtIndexPaths:@[indexPath] 
            withRowAnimation:UITableViewRowAnimationNone]; 
     } 
    }]; 
    self.deletedItems[rowKey] = item; 

    [self.tableView beginUpdates]; 
    [self.tableView endUpdates]; 

    [CATransaction commit]; 
} 

- (CGFloat)tableView:(UITableView *)tableView 
    heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (self.deletedItem[@(indexPath.row)]) { 
     return 0; 
    } 
    return CELL_HEIGHT; 
} 

Đoạn mã đã xóa các mục trong cấu trúc dữ liệu và thông báo cho bảng cập nhật. Bất kỳ mục nào trong cấu trúc dữ liệu đã xóa sẽ có chiều cao là 0, điều này sẽ dẫn đến hoạt ảnh "thu gọn".

Mã sử ​​dụng CATransaction để biết thời điểm hoạt ảnh đã hoàn tất. Sau khi hoàn thành, mục sẽ bị xóa khỏi cấu trúc dữ liệu tableData và bị xóa khỏi bảng mà không có bất kỳ hoạt ảnh nào.

LƯU Ý:

  • Tôi không chắc chắn nếu đồng bộ là cần thiết, nhưng có vẻ thông minh để có, vì chúng ta đang làm việc với các mặt hàng không đồng bộ xóa.
  • Tôi đã thử sử dụng đối tượng indexPath làm khóa cho từ điển, nhưng dường như nó không hoạt động. Đã sử dụng hàng thay thế.

Hy vọng điều này sẽ hữu ích.

1

Sử dụng UITableViewRowAnimationMiddle khiến nó hơi kém khủng khiếp đối với tôi.

Tương tự như vậy, tôi nhận thấy rằng với UITableViewRowAnimationTop, chiều cao vượt ra ngoài tableviews chiều cao ô mặc định xuất hiện/biến mất không có hoạt ảnh. Vì vậy, nếu tableview chiều cao hàng của bạn là 44, nhưng bạn động trong một tế bào với chiều cao 74, nó sẽ ngay lập tức hiển thị 30, và sau đó sinh động trong còn lại 44.

Với UITableViewRowAnimationMiddle nội dung di động sinh động trong độc đáo, nhưng biên giới ô là không ổn định trong suốt thời gian hoạt ảnh - ban đầu xuất hiện ở 30, sau đó làm động 44 phần còn lại.

+0

Ở đây chúng tôi đang ở năm 2017 và vấn đề này vẫn tồn tại trong tableWiews. 'Trung' thực sự tạo ra nội dung an toàn hơn' Top'. – DanBlakemore

Các vấn đề liên quan