2014-12-05 14 views
7

Khi sử dụng moveRowAtIndexPath:toIndexPath: để di chuyển một UITableViewCell, tôi nhìn thấy một trục trặc khi sử dụng hình ảnh động estimatedRowHeightUITableViewAutomaticDimension khi các tế bào sinh động từ trạng thái hữu hình đến trạng thái không hiển thị.UITableViewCell hoạt hình lỗi trong `moveRowAtIndexPath: toIndexPath:` trong khi sử dụng `estimatedRowHeight` và 'UITableViewAutomaticDimension`

Sự cố sẽ biến mất nếu tôi đặt rõ chiều cao của ô bằng cách triển khai tableView:heightForRowAtIndexPath:. Sự cố chỉ xuất hiện khi đường dẫn chỉ mục nguồn và đích hiển thị và không hiển thị tương ứng. Khi di chuyển đến một đường dẫn chỉ mục hiển thị khác, hoạt ảnh sẽ hoạt động như mong đợi.

tôi đã tạo ra một dự án mẫu để minh họa cho hiệu lực: https://github.com/timarnold/Table-Cell-Sizing-Bug

http://www.openradar.me/19156703

Sửa

@rdelmar chỉ ra rằng câu hỏi của tôi không thực sự đặt một câu hỏi.

Có ai biết cách khắc phục lỗi này và khắc phục hành vi này không? Hay tôi đang làm gì sai?

Chỉnh sửa 2014-12-08

Tôi đã sử dụng một trong các vé hỗ trợ nhà phát triển do Apple cung cấp để hỏi về vấn đề này với Apple. Họ xác nhận rằng đó là một lỗi (hãy truy cập http://www.openradar.me/19156703 để lừa) và không cung cấp bất kỳ giải pháp nào.

+0

Bạn biết cách khắc phục điều này, vậy câu hỏi của bạn là gì? Tôi nghĩ rằng đây là một trường hợp "bạn nhận được những gì bạn phải trả cho" (trả tiền là thời gian và mã phức tạp). Điều này, và các vấn đề với việc cuộn đến một indexPath cụ thể là hậu quả của chiều cao ước tính được sử dụng, vì vậy tôi không nghĩ rằng bạn có thể sửa chữa nó (nó sẽ rất thú vị để xem Apple có thể sửa nó hay không. sử dụng chiều cao ước tính). Bạn có lẽ có thể giảm thiểu hiệu ứng bằng cách cung cấp một ước tính chính xác hơn về chiều cao của bạn (mặc dù điều đó sẽ không giúp ích nhiều nếu bạn có chiều cao thay đổi rộng rãi). – rdelmar

+0

Vâng, nó không phải là quá nhiều câu hỏi vì nó là một tài liệu về vấn đề và một yêu cầu cho xung quanh công việc tiềm năng (tôi đoán yêu cầu của tôi nên rõ ràng hơn; sẽ chỉnh sửa câu hỏi). Tôi nghĩ rằng nó là công bằng để phân loại hành vi này như là một lỗi, tuy nhiên, kể từ khi dự án để tái sản xuất là khá đơn giản và sử dụng tất cả các thành phần chứng khoán và khả năng. –

+0

Tôi không biết liệu tôi có gọi đó là lỗi hay chỉ là hậu quả của việc giao dịch giữa tốc độ và tính chính xác mà Apple đã tạo ra. Đó là một kỹ thuật sẽ hoạt động trong một số trường hợp, nhưng không phải tất cả. Tôi nghĩ rằng công việc duy nhất xung quanh, là tính toán chiều cao theo cách "lỗi thời" - tôi hy vọng tôi sai về điều đó, bởi vì các tế bào tự định cỡ mới là tuyệt vời khi chúng hoạt động. – rdelmar

Trả lời

-2

Tim,

Đây không phải là câu trả lời dứt khoát mà là một số phát hiện thú vị. Thay vì một lỗi, tôi tin rằng hành vi bạn đang gặp phải liên quan đến cách iOS vẽ ô trên màn hình thiết bị. Cụ thể hơn, đến các ô bị tắt màn hình. Kể từ đó, nguồn dữ liệu không bị ảnh hưởng bởi các ô sắp xếp lại iOS mất theo dõi vị trí ô.

Để làm cho quan điểm của tôi rõ ràng tôi đã thực hiện các thay đổi sau đây để TableViewController.m:

Trong didSelectRowAtIndexPath

[tableView moveRowAtIndexPath:indexPath 
          toIndexPath:[NSIndexPath indexPathForRow:indexPath.row-3 inSection:indexPath.section]]; 

Trong cellForRowAtIndexPath

cell.textLabel.text = [NSString stringWithFormat:@"%ld", indexPath.row + 1]; 


Bạn sẽ thấy rằng các tế bào chỉ misbehave khi di chuyển đến vị trí bên ngoài màn hình. Ngoài ra, các ô được vẽ lại mỗi khi bạn di chuyển màn hình.

+1

Sự khác biệt giữa 'lỗi' và 'hành vi bạn đang gặp phải' không khớp với hành vi mong đợi mà tài liệu nói sẽ xảy ra là gì? –

+0

@AnthonyMattox câu hỏi của bạn không rõ ràng. Tôi chưa bao giờ đề cập đến tài liệu. Tôi đã thử nghiệm mã. – carlodurso

0

Cố gắng lưu vào bộ nhớ cache chiều cao ô.

private var cellHeights = [NSIndexPath: CGFloat]() 

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    if let cachedHeight = cellHeights[indexPath] { 
     return cachedHeight 
    } else { 
     return 60 
    } 
} 

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    cellHeights[indexPath] = cell.frame.height 
} 
Các vấn đề liên quan