Recentemente ho attraversò di corsa la necessità di cambiare l'immagine per il controllo di riordino, perché ho sottoclassato UITableViewCell
per fornire la mia cella di una tabella personalizzata. Come parte di questo sforzo, ho cambiato lo sfondo della cella in qualcosa di diverso dal colore predefinito.
Tutto funziona correttamente, ma quando ho messo il UITableView
in modalità di modifica, il controllo di riordino appare, con uno sfondo bianco - invece del colore di sfondo che stavo usando per la cella. Questo non ha un bell'aspetto e volevo che lo sfondo corrispondesse.
Durante le varie versioni di iOS, la gerarchia delle viste in un UITableViewCell
è stata modificata. Ho adottato un approccio che attraverserà l'intera serie di visualizzazioni finché non troverà la classe privata UITableViewCellReorderControl
. Credo che funzionerà per iOS 5 e tutte le versioni successive di iOS al momento di questa risposta. Si noti che mentre la classe UITableViewCellReorderControl
è privata, non sto utilizzando alcuna API privata per trovarla.
Innanzitutto, ecco il codice per eseguire la scansione del controllo di riordino; Sto assumendo che il testo "Riordina" sarà nel nome della classe - che Apple potrebbe cambiare in futuro:
-(UIView *) findReorderView:(UIView *) view
{
UIView *reorderView = nil;
for (UIView *subview in view.subviews)
{
if ([[[subview class] description] rangeOfString:@"Reorder"].location != NSNotFound)
{
reorderView = subview;
break;
}
else
{
reorderView = [self findReorderView:subview];
if (reorderView != nil)
{
break;
}
}
}
return reorderView;
}
nella vostra abitudine UITableViewCell sottoclasse, si ignorare -(void) setEditing:animated:
e trovare il controllo di riordino qui.Se si tenta di trovare questo controllo quando la tabella non è in modalità di modifica, il controllo di riordino non sarà nella gerarchia vista per la cella:
-(void) setEditing:(BOOL)editing animated:(BOOL)animated
{
[super setEditing:editing animated:animated];
if (editing)
{
// find the reorder view here
// place the previous method either directly in your
// subclassed UITableViewCell, or in a category
// defined on UIView
UIView *reorderView = [self findReorderView:self];
if (reorderView)
{
// here, I am changing the background color to match my custom cell
// you may not want or need to do this
reorderView.backgroundColor = self.contentView.backgroundColor;
// now scan the reorder control's subviews for the reorder image
for (UIView *sv in reorderView.subviews)
{
if ([sv isKindOfClass:[UIImageView class]])
{
// and replace the image with one that you want
((UIImageView *)sv).image = [UIImage imageNamed:@"yourImage.png"];
// it may be necessary to properly size the image's frame
// for your new image - in my experience, this was necessary
// the upper left position of the UIImageView's frame
// does not seem to matter - the parent reorder control
// will center it properly for you
sv.frame = CGRectMake(0, 0, 48.0, 48.0);
}
}
}
}
}
tua situazione potrebbe essere diversa; Spero che questo funzioni per te.
Non è diverso dalla vista predefinita; le linee sono ondulate anziché diritte ... –
Dove devo fare questo? Se lo faccio quando instanciamento della cella, l'unica cosa che ottengo è una vista aggiuntiva a sinistra della vista di riordino predefinita. Non riesco a riordinare le celle anche durante il trascinamento della nuova immagine. Ho provato a impostare 'cell.editingAccessoryType = UITableViewCellEditingStyleNone;' ma senza successo. –
I documenti dicono di usare 'UITableViewCellAccessoryDetailDisclosureButton' o la vista degli accessori di modifica non appare mai o risponde. Leggi i documenti di UITableView per i dettagli. – TechZen