2015-04-27 14 views
5

Ho un delegato della vista tabella che controlla se è possibile selezionare una cella specifica. In caso contrario, la selezione viene interrotta. Al fine di dare all'utente un feedback visivo voglio tingere un marchio di rosso questa cella e, dopo un breve lasso di tempo tingere Back to Black:Animazione in willSelectRowAtIndexPath dopo la convalida

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (true) {     // Some simplification 
     MyTableViewCell cell = ... // The correct cell is loaded here 
     [UIView animateWithDuration:0.5 animations:^{ 
      cellToSelect.labelAmount.textColor = [UIColor redColor]; 
     } completion:^(BOOL finished) { 
      [UIView animateWithDuration:1.0 animations:^{ 
       cellToSelect.labelAmount.textColor = [UIColor blackColor]; 
      }]; 
     }]; 
     return nil; 
    } 
    return indexPath; 
} 

Le animazioni non vengono eseguite. Invece, la cellula è solo (visivamente) deselezionata.

EDIT: Ho appena provato le soluzioni proposte e nessuno dei due sembrava funzionare. Così ho scavato un po 'più e ho scoperto che posso fare animazioni, ma non sono in grado di cambiare il textColor di etichette all'interno di una cella:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    MyTableViewCell cell = ... 
    cell.labelAmount.textColor = [UIColor redColor]; 
    // Now, although the property was set (as I can see in the debugger) 
    // the label is still drawn with standard black text. 
} 

Inoltre, impostando il colore tramite una stringa attribuito colorato non funziona .

D'altra parte, una modifica di highlightedTextColor viene presentata di conseguenza. Quindi questo funziona.

+0

Sei sicuro che la cella 'MyTableViewCell = ... // La cella corretta viene caricato here' caricare il cellulare qui? Il metodo 'cellForRowAtIndexPath' viene in genere utilizzato, ma non restituirà alcuna cella se quella cella non è visibile sullo schermo. – pteofil

risposta

1

Conforme alla documentazione Apple non è possibile animare tutto quello che volete:

Dalla mela:

Le seguenti proprietà della classe UIView sono animatable:

  • @property telaio
  • @ limiti di proprietà
  • @property center
  • @property trasformare
  • @property alfa
  • @property backgroundColor
  • @property contentStretch

Ora, questo è un trucco per animare ciò che si vuole:

Per esempio, impostare da alpha a 1.0 - non comporterà alcuna modifica visiva alla vista, ma lancerà l'animazione

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (true) {     // Some simplification 
     MyTableViewCell cell = ... // The correct cell is loaded here 
     [UIView animateWithDuration:0.5 animations:^{ 

      //here the trick set alpha to 1 
      self.view.alpha = 1; 

      cellToSelect.labelAmount.textColor = [UIColor redColor]; 
     } completion:^(BOOL finished) { 
      [UIView animateWithDuration:1.0 animations:^{ 
       cellToSelect.labelAmount.textColor = [UIColor blackColor]; 
      }]; 
     }]; 
     return nil; 
    } 
    return indexPath; 
} 
+0

In realtà, questa soluzione non cambia ancora nulla: l'animazione non viene eseguita e gli elementi dell'interfaccia utente non sono colorati in modo diverso (anche per proprietà come 'backgroundColor' e una durata di animazione di' 5'). – Bastian

+0

Quindi ho appena controllato cosa succede se provo ad animare il caso di successo: la riga è appena selezionata senza alcun fascino visivo ... => L'approccio non funziona anche per 'indexPath's! = Nil. – Bastian

+0

Prova a hadidSelectRowAtIndexPath' potrebbe essere meglio. Scusate se scrivo che il mio iPhone voglia scrivere in fr. – MacKentoch

3

Questa proprietà - textColor - non è animabile. Utilizzare transitionWithView:duration:options:animations:completion:

[UIView transitionWithView:label duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ 
    label.textColor = [UIColor redColor]; 
} completion:^(BOOL finished) { 
    [UIView transitionWithView:label duration:1.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ 
     label.textColor = [UIColor blackColor]; 
    } completion:nil]; 
}]; 
Problemi correlati