2015-09-02 16 views
8

Tôi có chế độ xem bảng có chứa trình giữ chỗ trong khi tải trong hình ảnh. Khi hình ảnh được tải, tôi gọi reloadRowsAtIndexPaths:withRowAnimation:. Tại thời điểm này, ô thay đổi chiều cao, dựa trên kích thước của hình ảnh. Khi điều đó xảy ra, tôi muốn bù đắp nội dung của chế độ xem bảng để duy trì tại chỗ và cho các ô bên dưới được đẩy xuống sâu hơn, như bạn có thể tưởng tượng.UITableView cuộn lên trên cùng khi tải lại các ô có chiều cao ô thay đổi

Hiệu ứng tôi nhận được thay vào đó là chế độ xem cuộn cuộn trở lại trên cùng. Tôi không chắc tại sao điều này lại xảy ra, và tôi dường như không thể ngăn nó lại được. Đặt beginUpdates() trước và endUpdates() sau dòng reloadRows không có hiệu lực.

Tôi đang sử dụng estimatedRowHeight, vì cần thiết vì chế độ xem bảng của tôi có khả năng có thể có hàng trăm hàng có chiều cao khác nhau. Tôi cũng đang triển khai tableView:heightForRowAtIndexPath:.

EDIT: Tôi đã thiết lập một dự án demo để kiểm tra điều này và thừa nhận rằng tôi không thể lấy dự án demo để tạo lại hiệu ứng này. Tôi sẽ tiếp tục làm việc ở đó.

+0

Bạn có thể đăng mã mà bạn đang sử dụng để nhận được bù đắp nội dung và cài đặt nội dung của bảng xem bạn muốn giữ tiêu điểm của bảng điểm ở đâu không? –

Trả lời

11

Luôn luôn cập nhật giao diện người dùng trên chủ đề chính. Vì vậy, chỉ cần đặt

[self.tableView reloadData]; 

bên trong một chủ đề chính:

dispatch_async(dispatch_get_main_queue(), ^{ 
    //UI Updating code here. 
    [self.tableView reloadData]; 
}); 
27

Đây là vấn đề với EstimatedRowHeight.

Càng nhiều ước tínhRowHeight khác với chiều cao thực tế, bảng càng có thể nhảy khi nó được tải lại, đặc biệt hơn nữa nó sẽ bị cuộn xuống. Điều này là do kích thước ước tính của bảng hoàn toàn khác với kích thước thực tế của bảng, buộc bảng điều chỉnh kích thước nội dung và bù đắp của nó.

Cách giải quyết dễ nhất là sử dụng ước tính thực sự chính xác ước tính. Nếu chiều cao mỗi hàng thay đổi rất nhiều, hãy xác định chiều cao trung bình cho một hàng và sử dụng nó làm ước tính.

+0

Trong thử nghiệm của tôi, tôi đã thử với một ước tính rất nhỏ, và một ước tính rất lớn, nhưng không có tác dụng di chuyển không mong muốn. – Andrew

+0

Đây là một câu trả lời khá hay. Cảm ơn bạn. Ước tínhHeight không nên là một số ngẫu nhiên nhưng gần với những gì bạn nghĩ rằng chiều cao là có được. – darwindeeds

+0

cảm ơn bạn, đó là lý do cho tôi. xấu nó hoạt động theo cách đó ... – warly

6

tôi đã cùng một vấn đề và quyết định nó bằng cách này: tiết kiệm cao của các tế bào khi họ tải và đưa ra giá trị chính xác trong tableView:estimatedHeightForRowAtIndexPath:

// declare cellHeightsDictionary 
NSMutableDictionary *cellHeightsDictionary; 

// save height 
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    [cellHeightsDictionary setObject:@(cell.frame.size.height) forKey:indexPath]; 
} 

// give exact height value 
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSNumber *height = [cellHeightsDictionary objectForKey:indexPath]; 
    if (height) return height.doubleValue; 
    return UITableViewAutomaticDimension; 
} 
+0

Trong trường hợp của tôi, tôi có 'self.tableView.estimatedRowHeight = 44;' trong lớp cha.Đặt nó bằng 0 trong lớp hiện tại, nơi tôi có chiều cao cố định hàng cố định vấn đề. –

0

Tôi đã thấy điều này và bản sửa lỗi phù hợp với tôi là chọn chiều cao hàng ước tính là hàng nhỏ nhất có thể. Ban đầu nó đã được thiết lập để chiều cao hàng lớn nhất có thể khi di chuyển không mong muốn đã xảy ra. Tôi chỉ sử dụng thuộc tính tableView.estimatedRowHeight duy nhất, không phải là phương thức ủy nhiệm.

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