2013-07-13 32 views
9

Tôi tò mò khi kích thước nội dung của UITableView được cập nhật sau khi thực hiện cuộc gọi hoạt ảnh chèn/xóa. Tôi nghĩ rằng nó sẽ giống như hầu hết các khối [UIView animation ...] trong đó kích thước khung hình/kích thước nội dung sẽ được cập nhật ngay lập tức ngay cả khi hoạt hình chưa hoàn thành, nhưng nó không có vẻ như vậy. Bất kỳ ý tưởng?Khi nào cập nhật kích thước nội dung UITableView với hàng chèn/xóa hoạt ảnh

+1

Bạn đã giải quyết vấn đề này chưa? Tôi đang chạy vào cùng một vấn đề. Chèn/xóa các hàng sau đó mong đợi tableView.contentSize được cập nhật, nhưng điều đó dường như không đồng bộ. – VaporwareWolf

Trả lời

0

Kích thước nội dung sẽ thay đổi sau khi kêu gọi các đại biểu về chiều cao:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section; 
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section; 
+2

Cảm ơn bạn đã phản hồi. Có anyway tôi có thể được thông báo hoặc bất kỳ loại phương pháp đại biểu sẽ cho tôi biết rằng kích thước nội dung đã thay đổi? Dường như xảy ra SAU khi hoạt hình hoàn tất nhưng tôi hy vọng sẽ nhận được kích thước nội dung mới TRƯỚC KHI vì vậy tôi có thể tạo hiệu ứng động xung quanh bảng cho phù hợp – SLEW

+0

Tôi đã thử điều này và đặt báo cáo nhật ký trước và sau khi tôi gọi phương thức tableview: heightForRowAtIndexPath: không thấy kích thước nội dung được cập nhật. Tuy nhiên, điều này đã giúp tôi đưa ra giải pháp để tính kích thước nội dung. Tôi sẽ đăng giải pháp dưới dạng câu trả lời riêng. – Daren

2

Thật không may, tôi đã không thể tìm thấy một cách tốt để cập nhật các contentSize khi thêm/xóa các hàng từ một UITableView một trong hai, nhưng Tôi đã tìm thấy một cách để tính toán những gì nó sẽ được nếu bạn biết đường dẫn chỉ số của các tế bào bạn đang thêm/loại bỏ.

Sử dụng đường dẫn chỉ mục của các hàng đã sửa đổi, bạn có thể tính chiều cao của các ô tương ứng với phương thức tableView: heightForRowAtIndexPath: và thêm nó vào chiều cao kích thước nội dung hiện tại của chế độ xem bảng. Dưới đây là một ví dụ nếu bạn đang thêm chỉ một dòng:

[self.tableView insertRowsAtIndexPaths:@[indexPathOfNewRow] withRowAnimation:UITableViewRowAnimationAutomatic]; 
CGFloat newCellHeight = [self tableView:self.tableView heightForRowAtIndexPath:indexPathOfNewRow]; 
CGFloat newContentSizeHeight = self.tableView.contentSize.height + newCellHeight 
1

Dường như sizeThatFits() có thể tiếp xúc với chiều cao của một mới contentSize đó là chưa giải quyết. Sau đó, bạn có thể chỉ định kích thước đang chờ xử lý đó để giải quyết sớm cho hoạt ảnh cuộn.

Với một cái gì đó như thế này:

extension UIScrollView { 

    var pendingContentSize: CGSize { 
     var tallSize = contentSize 
     tallSize.height = .greatestFiniteMagnitude 
     return sizeThatFits(tallSize) 
    } 

    func scrollToBottom(animated: Bool) { 
     contentSize = pendingContentSize 
     let contentRect = CGRect(origin: .zero, size: contentSize) 
     let (bottomSlice, _) = contentRect.divided(atDistance: 1, from: .maxYEdge) 
     guard !bottomSlice.isEmpty else { return } 
     scrollRectToVisible(bottomSlice, animated: animated) 
    } 

} 

Tôi có thể viết xem mã điều khiển như thế này:

tableView.insertRows(at: [newIndexPath], with: .none) 
tableView.scrollToBottom(animated: true) 

và có bàn di chuyển tất cả các cách để phía dưới (bằng cách sử dụng mới kích thước nội dung) thay vì di chuyển xuống hàng thứ 2 đến cuối cùng (sử dụng kích thước nội dung cũ).

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