Mam UITableView
, który używa niestandardowych UITableViewCell
s. Komórki mogą mieć jeden z trzech typów obrazów tła (ustawionych we właściwości każdej komórki: .backgroundView.image
): górny, środkowy lub dolny. Górne i dolne obrazy są dla pierwszej i ostatniej komórki i mają zaokrąglone rogi (podobnie jak zgrupowane komórki UITableView
). Wszystkie inne "środkowe" komórki wewnątrz UITableView
mają prostokątny środkowy obraz tła.Ponowne ładowanie niestandardowego UITableViewCell po zmianie kolejności komórek
Mój problem polega na tym, że podczas porządkowania komórek w trybie Edycja komórki nie odświeżają się z innym obrazem tła w zależności od ich nowej lokalizacji. Na przykład, jeśli przesunę pierwszą komórkę na środek stołu, nadal zachowuje ona swój pierwotny "górny" obraz tła (z zaokrąglonymi narożnikami), a nowa komórka wyświetlana u góry widoku tabeli nadal ma swój pierwotny "środek" obraz tła, który wygląda trochę dziwnie.
Mogę to obejść wykonując reloadData
w widoku tabeli, ale ma to problem z nie dostarczaniem ładnej, pełnej wdzięku animacji zmian. Zauważyłem, że gdy zmienia się standardową grupę zgrupowanych UITableView
, gdy tylko komórka zostanie przeniesiona/przeciągnięta, obraz tła na odpowiednich komórkach zmienia się (nawet zanim przeniesiona komórka została upuszczona w nowe miejsce), co wygląda bardzo ładnie. Chciałbym osiągnąć to samo.
W tym celu zaimplementowałem tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath
, która jest wywoływana za każdym razem, gdy wiersz jest przeciągany w widoku tabeli. W ramach tej próby wypróbowałem różne metody ustawiania backgroundView.image
, w tym bezpośrednio ustawiając obraz, a następnie wyraźnie mówiąc, aby przerysować komórkę i/lub obraz przy użyciu setNeedsLayout
i setNeedsDisplay
, ale nic nie wydaje się przerysowywać komórki. Mam NSLog
"wyniki tych zmian i wydają się być zatwierdzanie do komórki, ponieważ prawidłowe wartości pojawiają się w NSLog
, ale komórka po prostu nie wydaje się aktualizować na ekranie.
Jeśli ktokolwiek mógłby wskazać, co robię źle, lub zaproponować lepszy sposób osiągnięcia dobrego wyniku, byłbym bardzo wdzięczny. Dzięki!
EDIT: poniższy kod został wyciągnięty z dobroci i sformatowane tak może być łatwiej trawione:
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];
Możesz spróbować zamaskować widok stołowy z innym widokiem na nim. Wtedy w ogóle nie będziesz potrzebował obrazów backgorund dla komórek. – Eimantas
Czy mógłbyś wyjaśnić ten pomysł nieco więcej? Nie do końca rozumiem, jak to działa. – Skoota
Powiązane pytanie: http://stackoverflow.com/questions/7338161/update-old-new-top-bottom-cells-backgroundview-when-inserting-deleting-top-bott – an0