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.
Nguồn
2009-12-14 08:13:53
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
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. –
'[indexPath so sánh: expandedIndexPath] == NSOrderedSame' nên được viết dưới dạng' [indexPath isEqual: expandedIndexPath] ' – user102008