Tôi có UITableView
sử dụng tùy chỉnh UITableViewCell
s. Các ô có thể có một trong ba loại hình nền (được đặt trong thuộc tính .backgroundView.image
của mỗi ô): trên cùng, giữa hoặc dưới. Các hình ảnh trên cùng và dưới cùng dành cho các ô đầu tiên và cuối cùng, và có các góc tròn (giống như các ô của UITableView
được nhóm). Tất cả các ô "trung bình" khác trong hình UITableView
đều có hình nền ở giữa hình chữ nhật.Tải lại tùy chỉnh UITableViewCell sau khi sắp xếp lại các ô
Vấn đề của tôi là khi sắp xếp lại các ô trong chế độ Chỉnh sửa, các ô không làm mới với hình nền khác tùy thuộc vào vị trí mới của chúng. Ví dụ: nếu tôi di chuyển ô đầu tiên vào giữa bảng, nó vẫn giữ nguyên hình nền "trên cùng" ban đầu (với các góc tròn) và ô mới xuất hiện ở đầu chế độ xem bảng vẫn có "trung bình" ban đầu của nó hình nền, tất cả trông hơi lạ.
Tôi có thể giải quyết vấn đề này bằng cách thực hiện reloadData
trên chế độ xem bảng nhưng điều này có vấn đề không mang lại hiệu ứng động đẹp mắt cho những thay đổi. Tôi nhận thấy rằng khi sắp xếp lại một nhóm tiêu chuẩn UITableView
ngay sau khi một ô được di chuyển/kéo hình nền trên các ô có liên quan thay đổi (ngay cả trước khi ô di chuyển đã được thả vào vị trí mới của nó) trông rất đẹp. Tôi muốn đạt được điều tương tự.
Để kết thúc này, tôi đã triển khai tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath
được gọi là mỗi lần một hàng được kéo xung quanh trong chế độ xem bảng. Trong bài này tôi đã thử các phương pháp khác nhau để thiết lập backgroundView.image
bao gồm chỉ trực tiếp thiết lập hình ảnh và sau đó cũng yêu cầu nó vẽ lại ô và/hoặc hình ảnh bằng cách sử dụng setNeedsLayout
và setNeedsDisplay
nhưng không có gì làm cho việc vẽ lại ô. Tôi có NSLog
'ged kết quả của những thay đổi này và họ dường như cam kết với các tế bào, như các giá trị chính xác xuất hiện trong NSLog
, nhưng các tế bào dường như không được cập nhật trên màn hình.
Nếu bất cứ ai có thể chỉ ra những gì tôi đang làm sai, hoặc đề xuất một cách tốt hơn để đạt được một kết quả làm việc, tôi sẽ rất cảm kích. Cảm ơn!
EDIT: đoạn mã sau được kéo từ tiền thưởng và được định dạng để nó có thể được dễ dàng hơn tiêu hóa:
UIImage *rowBackground;
UIImage *selectionBackground;
NSInteger sectionRows = [_tableView numberOfRowsInSection:[indexPath section]];
NSInteger row = [indexPath row];
if (row == 0 && row == sectionRows - 1)
{
rowBackground = [UIImage imageNamed:@"field_title_bkg.png"];
selectionBackground = [UIImage imageNamed:@"field_title_bkg.png"];
}
else if (row == 0)
{
rowBackground = [UIImage imageNamed:@"table_row_top_bkg.png"];
selectionBackground = [UIImage imageNamed:@"table_row_top_bkg.png"];
}
else if (row == sectionRows - 1)
{
rowBackground = [UIImage imageNamed:@"table_bottom_row_bkg.png"];
selectionBackground = [UIImage imageNamed:@"table_bottom_row_bkg.png"];
}
else
{
rowBackground = [UIImage imageNamed:@"table_row_bkg.png"];
selectionBackground = [UIImage imageNamed:@"table_row_bkg.png"];
}
UIImageView *rowBackGroundImageView = [[UIImageView alloc] initWithImage:rowBackground];
UIImageView *rowBackGroundSelectionImageView = [[UIImageView alloc] initWithImage:selectionBackground];
if (row != sectionRows - 1)
{
UIImageView *sep = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cell_separator.png"]];
[sep setFrame:CGRectMake(20, 56, 280, 1)];
[rowBackGroundImageView addSubview:sep];
}
[cell setBackgroundView:rowBackGroundImageView];
[rowBackGroundImageView release];
Bạn có thể thử che mặt bảng với chế độ xem khác ở trên đầu trang. Sau đó, bạn sẽ không cần backgorund hình ảnh cho các tế bào ở tất cả. – Eimantas
Bạn có thể giải thích ý tưởng này thêm một chút không? Tôi không hoàn toàn làm theo cách đó sẽ làm việc. – Skoota
Câu hỏi liên quan: http://stackoverflow.com/questions/7338161/update-old-new-top-bottom-cells-backgroundview-when-inserting-deleting-top-bott – an0