2015-09-07 20 views
12

Tôi có chế độ xem bảng với tiềm năng cho từng ô có chiều cao riêng, do đó không phù hợp để sử dụng rowHeight. Thay vào đó, ngay bây giờ tôi đang sử dụng let indexSet = NSIndexSet(index: 10)self.tableView.estimatedRowHeight = 75. Điều này có nghĩa là nó gọi hàm sizeThatFits trên ô, để xác định chiều cao của nó. Tất cả đều hoạt động tốt.UITableView với chiều cao di động động nhảy khi cuộn lên sau khi tải lại ô

Vấn đề là khi bạn tải lại một ô trên màn hình. Cuộn xuống để hiển thị ô 10, ví dụ, sau đó tải lại ô 10, hoạt động tốt. Nhưng khi bạn bắt đầu cuộn lùi lại, qua các ô bạn đã thấy, nó sẽ chuyển về ước tínhRowHeight cho mỗi ô, hoàn toàn bỏ qua sizeThatFits và do đó nhảy xung quanh khi bạn cuộn. Tôi không thể đưa ra một ước lượng chính xác hoặc 'đủ tốt' để có thể nhận thấy sự nhảy vọt này, vì các tế bào của tôi sẽ có thể hiển thị một dòng văn bản hoặc một hình ảnh đầy đủ - một sự khác biệt lớn trong kích thước.

tôi đã thể hiện hiệu ứng này ở đây:

https://vid.me/edgW

tôi đã thực hiện nhiều nỗ lực khác nhau ở đây, sử dụng một hỗn hợp của heightForRowAtIndexPath, estimatedHeightForRowAtIndexPath .. vv .. Tôi đã thử phần khác nhau của lời khuyên về StackOverflow. Không có gì có vẻ hiệu quả.

Tôi đã kèm theo một dự án mẫu rất đơn giản, nơi bạn có thể thử nó cho chính mình:

https://www.dropbox.com/s/8f1rvkx9k23q6c1/tableviewtest.zip?dl=0

  1. Run dự án.
  2. Cuộn cho đến khi ô 10 đang ở chế độ xem.
  3. Đợi tối đa 5 giây để ô tải lại (nó trở thành màu tía).
  4. Cuộn lên.

Lưu ý đáng giá - điều này không không xảy ra nếu ô không ở chế độ xem khi được tải lại. Nếu nó ở trên hoặc bên dưới điểm cuộn hiện tại, mọi thứ hoạt động như mong đợi.

+2

Đừng chỉ gửi một dự án và yêu cầu mọi người để tìm ra vấn đề của bạn. Cập nhật câu hỏi của bạn bằng mã có liên quan. – rmaddy

+0

tôi gặp sự cố tương tự với 'UICollectionView'. cả hai đều giống nhau, do đó, một cách tiếp cận tương tự có thể giúp với điều này. đăng [câu trả lời ở đây] (https://stackoverflow.com/a/45361410/6744473) – shoe

Trả lời

15

Hành vi này có vẻ là một lỗi, nếu không có lý do nào khác hơn là nó không còn có thể tái sản xuất trên iOS 9. Tôi chắc chắn đó không phải là sự an ủi nhiều.

Vấn đề chủ yếu xuất phát từ việc ước tính không chính xác, như @NickCatib cho biết. Điều tốt nhất bạn có thể làm trên iOS 8 là cải thiện ước tính. Một kỹ thuật mà nhiều người đã đề xuất là để có chiều cao bộ nhớ cache trong willDisplayCell và sử dụng chúng trên các cuộc gọi tiếp theo tới estimatedRowHeightAtIndexPath.

Bạn có thể giảm thiểu hành vi bằng cách không làm bất cứ điều gì để nhận được UITableView để loại bỏ bộ đệm của nó, chẳng hạn như sửa đổi nội dung trong ô trực tiếp bằng cách sử dụng cellForRowAtIndexPath thay vì sử dụng tải lại nếu đó là trên màn hình. Tuy nhiên, điều đó sẽ không giúp ích gì nếu bạn thực sự cần thay đổi chiều cao của ô.

Tôi e ngại nói rằng lỗi không thể dễ dàng được sửa trong chế độ xem bảng vì bạn không có quyền kiểm soát bố cục. Lỗi có thể dễ dàng làm việc xung quanh trong một lớp con UICollectionViewFlowLayout bằng cách thay đổi contentOffsetAdjustment trong quá trình hủy bỏ hiệu lực, mặc dù điều đó có thể không quá dễ dàng.

+0

Đây là câu trả lời đúng: trả về các giá trị thích hợp 'EstimatedRowHeightAtIndexPath:' hoàn toàn làm cho vấn đề này biến mất. – MarcWan

+0

Tôi yêu bạn rất nhiều. Điều này giải quyết vấn đề của tôi ngay lập tức. Là một hiệu ứng phụ thú vị, độ cao của bộ nhớ đệm cũng giúp cuộn * thật nhanh * nên tôi thực sự khuyên bạn nên lưu bộ nhớ đệm – Sirens

-1

Tôi đang đối mặt với cùng một vấn đề, bảng của tôi hoạt động tốt cho đến khi việc tải lại chế độ xem bảng. Vì vậy, tôi tìm thấy một giải pháp, chỉ sử dụng rowHeight không được ước tính chiều cao. Ngoài ra nếu bạn có chiều cao khác nhau. Vì vậy, vui lòng cung cấp mã hoàn chỉnh để tôi sẽ cung cấp giải pháp. Tôi có một ô giống như trang instagram. Tôi đang vượt qua chiều cao tính toán trong phương pháp heightforrow mà làm việc tốt. Nhưng chiều cao ước tính không hoạt động tốt trong tình huống đó. Nếu bạn sử dụng mã dưới đây, nó hoạt động tốt. Vui lòng thử.

self.tableView.rowHeight = 75 //it will be your dynamic height 
//self.tableView.estimatedRowHeight = 75 

Nếu bạn nhầm lẫn để tính chiều cao cho hàng cho mỗi ô, chỉ cần đăng mẫu tôi sẽ cung cấp giải pháp. Nếu tôi có thể Cảm ơn

0

Uh ... đây là vấn đề khó giải quyết.

Hãy xem facebook. Họ đã có cùng một vấn đề với dòng thời gian của họ, và họ đã làm điều đó trong một số loại xem web.

Tôi gặp sự cố tương tự với một số loại dòng thời gian, đã sử dụng chiều cao hàng tự động và có vấn đề đó. Điều đầu tiên để giải quyết nó là để thiết lập estimatedHeight càng gần càng tốt để chiều cao tế bào trung bình.Đó là khá khó để đối phó với vì bạn có thể có văn bản (chiều cao 50) hoặc hình ảnh + văn bản (chiều cao 1500). Điều tiếp theo cần làm với việc cải thiện điều này là triển khai thực hiện estimatedHeight forIndexPath mà cơ bản trả về chiều cao ước tính khác nhau cho các indexPath khác nhau.

Sau đó đã có rất nhiều giải pháp khác nhưng điều này là gần nhất vì nó có thể với chiều cao biến (sự khác biệt lớn).

3

Tôi cũng gặp sự cố này và đã sử dụng giải pháp từ SO mà tôi không thể tìm thấy ngay bây giờ. Nếu có, tôi sẽ thêm liên kết. Đây là giải pháp:

Vấn đề là với chế độ xem bảng không có ước tính đúng cho chiều cao của hàng. Để khắc phục sự cố, hãy lưu trữ chiều cao ban đầu trong willDisplayCell và thời gian tiếp theo sử dụng chiều cao đó.

Trong viewDidLoad:

heightAtIndexPath = [NSMutableDictionary new]; 


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

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    return UITableViewAutomaticDimension; 
} 

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    if([heightAtIndexPath objectForKey:indexPath]) { 
     return [[heightAtIndexPath objectForKey:indexPath] floatValue]; 
    } else { 
     return UITableViewAutomaticDimension; 
    } 
} 
+1

Cuối cùng! Cảm ơn bạn!! –

+0

@ kam.voick bạn được chào đón! Tôi sẽ không lấy tín dụng cho câu trả lời mặc dù, tôi tìm thấy nó ở một nơi khác trên SO nhưng không thể tìm thấy liên kết đến nó nữa. Chào mừng bạn đến với SO! –

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