Il pulsante di cancellazione di UITableViewCell viene coperto

AGGIORNARE:

Grazie alle informazioni di “Evgeny S” sono stato in grado di determinare che ciò che sta nascondendo il pulsante Elimina è lo sfondo della cella. Ho avuto la seguente funzione chiamata all’inizio della cella init:

- (void) setupGradientsWithHeight:(int) the_height { CAGradientLayer* gradient = [CAGradientLayer layer]; gradient.frame = CGRectMake(self.bounds.origin.x, self.bounds.origin.y, self.bounds.size.width, the_height); gradient.colors = [NSArray arrayWithObjects: (id)[UIColor colorWithRed:218.0f/255.0f green:218.0f/255.0f blue:220.0f/255.0f alpha:1.0].CGColor, (id)[UIColor colorWithRed:180.0f/255.0f green:180.0f/255.0f blue:184.0f/255.0f alpha:1.0].CGColor,nil]; UIView* bgview = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)]; [bgview.layer addSublayer:gradient]; [self setBackgroundView:bgview]; } 

Il problema è risolto NON aggiungendo la backgroundview. Tuttavia, mi chiedo come potrebbe essere risolto preservando lo sfondo sfumato per ogni cella?

Una delle due cose potrebbe accadere. Quando viene visualizzato il pulsante Elimina, la vista di sfondo viene spostata e quindi indietro, oppure la sua dimensione viene ridotta e quindi ripristinata. Ho provato a fare confusione con il componente larghezza “self.bounds.size.width” per il frame del gradiente, ma continuo a non vedere come questo potrebbe influenzare le cose perché questa funzione viene chiamata solo una volta all’inizializzazione della cella.

POST ORIGINALE:

Avevo creato un’app in Xcode4 sotto iOS6 SDK, ma dopo aver caricato le cose nel nuovo ambiente (Xcode5 e iOS7 SDK) mi sono imbattuto in un problema. Si noti che ho risolto tutti gli errori di generazione e gli avvisi che si sono verificati durante la transizione.

Ho una vista tabella con alcune celle. Dopo aver triggersto la modalità di modifica, se si fa clic sul pulsante di commutazione rosso per avviare la modalità di eliminazione per una cella: l’animazione inizia e viene visualizzato il pulsante “Elimina”, ma solo brevemente e viene quindi nuovamente nascosto.

Un’altra cosa strana che dovrei notare è che anche quando il pulsante di cancellazione è coperto, puoi ancora fare clic dove dovrebbe essere ed eliminare la cella.

Ho cercato di estrarre il maggior numero ansible di “codice personalizzato”, ho rimosso le funzioni che avevo sovrascritto e ho cercato di riportare le cose a uno stato originale il più ansible, ma senza successo.

Ad un certo punto avevo visto uno strano messaggio nel registro di output: “tentare di impostare uno swipe per eliminare la cella quando ne abbiamo già uno …. non sembra buono”. Per qualche ragione, il messaggio appare più a lungo e non riesco a ricordare cosa stavo facendo in quel momento.

Qualche idea o raccomandazione su cosa potrebbe causare questo?

Questo è uno dei numerosi bug di iOS 7.

Per qualche motivo, lo sfondoView viene spostato da iOS sul pulsante Elimina. Puoi aggirare questo sottoclass il tuo backgroundView e implementando la funzione setFrame della tua vista derivata in questo modo:

 - (void)setFrame:(CGRect)frame { if ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending) { // background view covers delete button on iOS 7 !?! [super setFrame:CGRectMake(0, frame.origin.y, frame.size.width, frame.size.height)]; } else { [super setFrame:frame]; } } 

Come nota a margine: puoi evitare la necessità di un sottolivello separato sottoclassi e implementazione di layerClass nella tua vista derivata:

 + (Class)layerClass { return [CAGradientLayer class]; } 

Ho risolto questo problema trovando la vista del pulsante di cancellazione e portandola in primo piano. L’ho fatto in layoutSubviews in una sottoclass UITableViewCell.

Ecco un piccolo frammento di codice che dovrebbe darti un’idea di come farlo:

 - (void)layoutSubviews { [super layoutSubviews]; for (UIView *subview in self.subviews) { for (UIView *subview2 in subview.subviews) { if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { // move delete confirmation view [subview bringSubviewToFront:subview2]; } } } 
 - (void)layoutSubviews { [super layoutSubviews]; [self sendSubviewToBack:self.contentView]; } 

Stavo affrontando un problema in cui il mio UITableView era in modalità di modifica e dopo aver eliminato 2-3 righe ricevo il messaggio “tentare di impostare uno sfioramento per eliminare la cella quando ne abbiamo già uno …. che non sembra buono” registrato e quindi Interazione utente su tutte le celle tranne una cella viene disabilitata.

Ho risolto questo problema con

 [myTableView setEditing:NO animated:NO]; [myTableView setEditing:YES animated:NO]; 

dopo ogni cancellazione.

Questa soluzione ha funzionato nel mio caso.

È ansible utilizzare colorWithPatternImage ma per me è stato più semplice utilizzare self.layer.content. per esempio :

 cell.layer.contents = (id)[UIImage imageNamed:@"singleRow.png"].CGImage; 

In questo modo l’immagine non viene allungata e non deve essere in dimensioni esatte. In questo modo il pulsante Elimina non viene coperto dall’immagine di sfondo della cella. By The Way: questi sfondi sfumati personalizzati non sembrano corrispondere alle apparenze di base di iOS 7, pensi che potrebbe essere un motivo per non approvare l’app?

Mi sono imbattuto in un problema simile e ho risolto il problema con il pulsante Elimina in cima al contenuto della mia cella, ma l’animazione è un po ‘brutta. Al termine, il pulsante è visibile e fa la cosa giusta.

Crea una sottoclass personalizzata di UITableViewCell e aggiungi il seguente codice:

 -(void)didTransitionToState:(UITableViewCellStateMask)state { if (state & UITableViewCellStateShowingDeleteConfirmationMask ) { [self sendSubviewToBack:self.contentView]; } [super didTransitionToState:state]; } 

Miglioramenti su questo approccio o altri indicatori sarebbero apprezzati.

Pulitore, soluzione generale

Supponendo un’app solo iOS7, con una tecnica simile a quella postata da chris sopra, credo che l’approccio qui: https://stackoverflow.com/a/19416870/535054 sarà più pulito.

In questo approccio, non è necessario creare sottoclass del backgroundView, che potrebbe essere diverso per celle diverse.

Inserisci il codice nella risposta che ho collegato sopra, nella radice della gerarchia di celle della tabella personalizzata e tutte le celle della tabella (che ereditano da essa), ottieni la correzione ogni volta che usano le proprietà backgroundView o selectedBackgroundView .

Sto ancora vedendo questo problema dopo l’aggiornamento a XCode 5.0.1 ma ho usato una soluzione alternativa che consiste nell’utilizzare un booleano denominato changeTitle impostato su NO in willBeginEditingRowAtIndexPath e impostato su YES in editingStyleForRowAtIndexPath se non ci troviamo in modalità di cancellazione riga .

Quindi uso questa variabile per titleForDeleteConfirmationButtonForRowAtIndexPath il titolo del pulsante con alcuni spazi aggiuntivi in titleForDeleteConfirmationButtonForRowAtIndexPath .

 -(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath { if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0 && changeTitle) { return @" Delete"; } return @"Delete"; } 

Funziona per me, ma l’inconveniente principale è che l’area di conferma è più ampia di quanto pensi sia così che è ansible una cancellazione non intenzionale.

Puoi evitare il problema impostando lo sfondo che vuoi per uitableview e impostando cell.backgroudColor = [UIColor clearColor]; e cell.contentView.backgroundColor = [UIColor clearColor];

Se il progetto è stato avviato in iOS 6 SDK e utilizza gli storyboard, questo potrebbe essere il problema con i vincoli. Prova a eliminare tutti i vincoli di cella e torna a suggerire. Questo potrebbe risolvere i problemi con il pulsante Elimina. Ho avuto tali problemi in due diversi progetti e sono stati risolti in modo descritto.

E ancora una soluzione:

 - (void) layoutSubviews { [super layoutSubviews]; if ([ [ [UIDevice currentDevice] systemVersion] compare: @"7.0" options: NSNumericSearch] != NSOrderedAscending) { if (iOS7 == YES) { self.backgroundView.frame = CGRectMake(0, self.backgroundView.frame.origin.y, self.backgroundView.frame.size.width, self.backgroundView.frame.size.height); } } 

Ecco un modo migliore per assicurarti di creare una sottoclass di UITableviewController per prestazioni migliori e aggiungere questo codice

 - (void)setEditing:(BOOL)editing animated:(BOOL)animated { [super setEditing:editing animated:animated]; CGRect frame = self.tableView.frame; if(editing){ [self.tableView setFrame:CGRectMake(0, frame.origin.y, frame.size.width, frame.size.height)]; //other codes to run if needed }else{ [self.tableView setFrame:frame]; //other codes to run if needed } 

}