2009-12-14 33 views
5

thể trùng lặp:
Can you animate a height change on a UITableViewCell when selected?Animate UITableViewCell chiều cao trên lựa chọn

Tôi đã làm rất nhiều Googling để cố gắng tìm ra cách đúng để làm điều này, và cho đến nay Tôi đang thua lỗ.

Tôi đã phân lớp UITableViewCell với chế độ xem của riêng mình và tôi đang cố tạo hiệu ứng chiều cao của UITableViewCell để mở rộng khi được chọn và hợp đồng khi được chọn lại. Bảng này có tiềm năng chứa hàng nghìn hàng, vì vậy tôi không muốn ghi đè chiều cao tableForRowAtIndexPath của tableView. Lý tưởng nhất là tôi muốn có thể có nhiều ô được mở rộng cùng một lúc, nhưng điều đó không quan trọng. Cách tốt nhất để làm việc này là gì?

Cảm ơn bạn, Justin

Trả lời

6

Không có cơ chế khác để xác định chiều cao tế bào hơn heightForRowAtIndexPath. Trừ khi bạn đang tính toán đúng cho ô mở rộng trong phương thức đó, bạn sẽ tìm thấy các ô khác của bạn chạy trên nó hoặc ẩn dưới nó. Từ mã đầu xương mà tôi quên thiết lập heightForRowAtIndexPath, tôi chắc rằng các ô khác của bạn sẽ được hiển thị trên đó.

Vì bạn đang nói hàng nghìn hàng, chúng tôi giả định rằng người dùng không thể sắp xếp lại các ô.

Điều bạn có thể làm là lưu trữ đường dẫn chỉ mục của ô được mở rộng khi người dùng chạm vào một ô cụ thể. Sau đó, heightForRowAtIndexPath có thể trông như thế này:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 

if ([indexPath isEqual:lastSelectedIndexPath]) 
{ 
    return 80; 
} 

else { 
    return 44; 
} 

} 

Nếu bạn thực sự muốn có nhiều lựa chọn, bạn có thể lưu trữ các đường dẫn chỉ số phù hợp với một mảng và kiểm tra đối với họ như thế này:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 

CGFloat cellHeight = 44; 

for (NSIndexPath *expandedIndexPath in expandedIndexPathsArray) 
{ 
    if ([indexPath compare:expandedIndexPath] == NSOrderedSame) 
    { 
     cellHeight = 80; 
     break; 
    } 
} 

return cellHeight; 

} 

Lấy hình ảnh động để nhìn bên phải sẽ mất một số công việc. Tôi đã chơi đùa với ý tưởng giao diện người dùng cụ thể này một thời gian và không bao giờ có thể tự mình ngồi xuống và thực sự làm cho nó xảy ra. Một điều bạn có thể làm là hiển thị chế độ xem giả tạo hoạt ảnh trong khi bạn đang cập nhật chế độ xem bảng phía sau nó.

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPathswithRowAnimation:(UITableViewRowAnimation)animation 

có thể quan tâm cho điều này vì bạn có thể sử dụng hoạt ảnh ô để mô phỏng chuyển động của các ô bên dưới để phù hợp với việc mở rộng của bạn.

Nếu bạn có thể bỏ toàn bộ khung hình của ô, bạn có thể thực hiện hoạt ảnh mờ đục của dữ liệu được mở rộng khi độ cao mới đã được đặt.

Đó là một khó khăn nhưng nếu bạn làm cho nó hoạt động tôi đặt cược nó sẽ được khá mát mẻ. Chúc may mắn.

+1

Cảm ơn Danilo, bạn đã bắt đầu đi đúng hướng. Tôi đã kết thúc lên nhận được nó làm việc bằng cách sử dụng reloadRowsAtIndexPaths trong didSelectRowAtIndexPath. Tôi kiểm tra xem liệu ô có được mở rộng không và thiết lập chiều cao tương ứng trong heightForRowAtIndexPath, giống như bạn đã đề cập. Cảm ơn một lần nữa! – Justin

+1

Quá tuyệt! Vui mừng được cung cấp cho bạn một cú hích hữu ích. Hy vọng nó hoạt động ra ngoài. Có lẽ cuối cùng tôi sẽ cố gắng thử một trong những ngày này. –

+1

'[indexPath so sánh: expandedIndexPath] == NSOrderedSame' nên được viết dưới dạng' [indexPath isEqual: expandedIndexPath] ' – user102008

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