2011-02-07 3 views
7

Po prostu chcę, aby komórka podświetliła się na krótko UIColor lub obrazem tła przed animacją z powrotem do stanu niezaznaczonego, gdy użytkownik dotknie komórki. Zaznaczam komórkę gwiazdką, aby pokazać, że została wybrana, ale chciałabym, aby cała komórka podświetliła się na chwilę tylko po to, by pokazać zaznaczenie.Czy istnieje sposób animowania obiektu UITableViewCell, aby wiersz migał krótko na wybranym stanie, a następnie z powrotem na biały w zaznaczeniu?

Odpowiedz

14

dodać tę linię w didSelectRowAtIndexPath -

[tableView deselectRowAtIndexPath:indexPath animated:YES]; 
+1

takie proste! Dzięki, czy znasz sposób kontrolowania czasu trwania animacji? – Nathan

+0

Nie sądzę, że jest to możliwe dzięki tej metodzie. możesz to zrobić za pomocą niestandardowej animacji komórki. – shannoga

+0

Jeśli chcesz kontrolować animację, ponieważ trwa to zbyt długo, możesz polubić, jak szybko miga, gdy ustawisz animację na false/NO – Rob

0

Jeśli chcesz mieć większą kontrolę nad tym, co kulminacyjnym wygląda, można użyć „podświetlony” własność etykiecie komórki i ustawić selectedBackgroundView. Zarówno krótko będzie migać i wyłącza, gdy wybrany

// text color 
[[cell textLabel] setTextColor:[UIColor blackColor]]; 
[[cell textLabel] setHighlightedTextColor:[UIColor whiteColor]]; 

// background image 
UIImageView *backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cell-background.png"]]; 
[cell setBackgroundView:backgroundView]; 
[backgroundView release]; 
UIImageView *selectedBackgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cell-background-highlighted.png"]]; 
[cell setSelectedBackgroundView:selectedBackgroundView]; 
[selectedBackgroundView release]; 
14

Myślę, że odpowiedź jest stałe pod warunkiem, jeśli chcesz animować tylko jeden wiersz w odpowiedzi na selekcję.

Szukałem sposobu, aby to zrobić z wieloma wierszami jednocześnie i bez zaznaczania i odznaczania wierszy w odpowiedzi na dotyk. Zrobiłem, co następuje:

Stworzył metodę w moim UITableViewController nazwie „calloutCells”:

- (void)calloutCells:(NSArray*)indexPaths 
{ 
    [UIView animateWithDuration:0.0 
          delay:0.0 
         options:UIViewAnimationOptionAllowUserInteraction 
        animations:^void() { 
         for (NSIndexPath* indexPath in indexPaths) 
         { 
          [[self.tableView cellForRowAtIndexPath:indexPath] setHighlighted:YES animated:YES]; 
         } 
         } 
        completion:^(BOOL finished) { 
         for (NSIndexPath* indexPath in indexPaths) 
         { 
          [[self.tableView cellForRowAtIndexPath:indexPath] setHighlighted:NO animated:YES]; 
         } 
         }]; 
} 

Należy pamiętać, że czas trwania i opóźnienie nie zmieniają animację wybrałem ponieważ używam wbudowanego w animacji na setHighlighted.

Kiedy chcę zainicjować podświetlenie/usuwa zaznaczenie animacji z UITableViewController, mogę jednocześnie zaznaczyć wiersze 3 i 4 sekcji 0 takiego:

[self calloutCells:[NSArray arrayWithObjects: 
        [NSIndexPath indexPathForRow:3 inSection:0], 
        [NSIndexPath indexPathForRow:4 inSection:0], nil]]; 

Nadzieja to pomaga kogoś innego! Wersja

+0

Bardzo proste, bardzo eleganckie rozwiązanie. – allprog

+0

Działa to świetnie i ma tę dodatkową zaletę, że pozwala na programowe flashowanie ('didSelectRowAtIndexPath' jest wywoływane tylko w przypadku wierszy, które są faktycznie stuknięte). – devios1

0

swift3:

func calloutCell(indexPath: IndexPath) { 
     UIView.animate(withDuration: 0, 
         delay: 0, 
         options: .allowUserInteraction, 
         animations: { 
         let cell = self.tableView.cellForRow(at: indexPath) 
         cell?.setHighlighted(true, animated: true) 
     }) { (f: Bool) in 
      let cell = self.tableView.cellForRow(at: indexPath) 
      cell?.setHighlighted(false, animated: true) 
     } 
    } 

Wewnątrz komórek:

self.selectionStyle = .blue 
let uiview = UIView(frame: CGRect(x: 0, y: 0, width: 209, height: 251)) 
uiview.backgroundColor = UIColor.red 
self.selectedBackgroundView = uiview