2010-08-23 16 views
10

C'è un modo per cambiare l'immagine del controllo di riordino che viene visualizzato quando UITableView è in modalità di modifica? Ho una UIImage che vorrei mostrare al posto delle solite barre grigie.UITableViewCell controllo personalizzato riordino

Devo eseguire la sottoclasse di UITableViewCell per eseguire questa operazione?

risposta

1

Ho messo un po 'di lavoro in questo di recente, ma è venuto a breve. Ho provato a impostare il mio editingAccessoryView ma non è riuscito a far cambiare il controllo di riordino. Dispari.

La mia ipotesi è che ha qualcosa a che fare con il seguente commento nella documentazione UITableViewCell re: showsReorderControl:

Se il valore è YES, il controllo riordino sostituisce temporaneamente qualsiasi vista accessorio.

In altre parole, la modifica di AccessView viene sostituita dalla vista di controllo di riordino, che potrebbe essere il motivo per cui non è possibile sovrascrivere il controllo di riordino. Sperando che qualcuno possa trovare una soluzione alternativa.

0

Si imposta la proprietà editingAccessoryView della cella su una vista immagine contenente l'immagine desiderata.

Per inciso, ti raccomando di fare attenzione quando lo fai. Quando si sostituisce un grafico personalizzato per uno standard di sistema come l'immagine di riordino, si corre il serio rischio di confondere l'utente. La grammatica UI standard ha detto loro di aspettarsi l'immagine standard durante il riordino e potrebbero non capire il significato della grafica personalizzata.

+0

Non è diverso dalla vista predefinita; le linee sono ondulate anziché diritte ... –

+0

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. –

+0

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

9

Immagino che ci sia già molto tempo, ma è arrivata una nuova domanda.

Vedere la mia risposta qui:

Change default icon for moving cells in UITableView

+0

Grazie. È bello mantenere vivi i vecchi interrogativi quando arrivano nuove soluzioni, nel caso qualcuno cerchi questo problema! –

+0

@RaphaelSchweikert, è esattamente quello che mi è appena successo. – mattsson

+0

Questa domanda continua ad essere utile ANNI dopo il suo post. Buon lavoro. – Unome

3

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.

0

Forse stiamo tutti pensando troppo a questo. :)

Basta mettere un'abitudine UIImageView sopra l'accessorio di spostamento predefinito in modo da coprirlo. Fatto.

Problemi correlati