2012-02-25 13 views
5

tylko jako tło, to pytanie jest związane z tym jednym napisałem wcześniej: Trying to expand/collapse UITableViewCell from a UIButton on the custom cellUITableViewCell rozwinąć/zwinąć animacji (prace przy rozbudowie, ale nie zawaleniem)

Podsumowując, mam UITableView z kilka niestandardowych komórek tabeli . Każdy niestandardowy UITableViewCell ma obszar tekstowy, a następnie przycisk "Zobacz więcej". Zasadniczo każda komórka początkowo wyświetla 3 wiersze tekstu, ale gdy użytkownik kliknie przycisk "Wyświetl więcej", komórka powinna rozwinąć się do całej wysokości obszaru tekstowego. Ponowne naciśnięcie przycisku zwiń komórkę.

myślę, że to jest trudne do wizualizacji, więc wziąłem krótki film tutaj: http://dl.dropbox.com/u/762437/cell-animation.mov

(chodzi o plik 3.5MB, więc shouldnt brać tak długo ładować). W filmie pokazuję komórkę wykonującą animację rozwijania/zwijania. Podczas rozwijania przycisk "Pokaż więcej" animuje się w dół. Po ponownym dotknięciu, po prostu przeskakuje z powrotem do pierwotnej pozycji bez animacji. Edycja: Przepraszam, powinienem być bardziej jasny. UITableView prawidłowo animuje komórki, a ja pytam, jak poprawnie animować przycisk "Zobacz więcej".

Mam funkcję rozwijania/zwijania (czy zrobiłem to dobrze, czy źle to inna sprawa!), Ale animacje nie działają tak jak oczekuję. Rozwijająca się animacja działa, ale nie zapada się.

W każdej niestandardowej klasie UITableViewCell mam funkcję IBAction, która jest wywoływana, gdy użytkownik dotknie przycisku "Wyświetl więcej". Również śledzę komórki, które są obecnie rozwijane w NSMutableArray. Kiedy użytkownik kliknie przycisk "Zamknij", ta komórka zostanie usunięta z tablicy.

W mojej komórce TableViewForRowAtIndexPath sprawdzam tablicę, aby zobaczyć, które komórki powinny zostać rozwinięte i które powinny być wyświetlane w domyślnym rozmiarze.

Robię tak z tym kodem:

// Check if the array contains the particular cell, if so, then it needs to be expanded 
if([expandedRows containsObject:indexPath]) 
     { 
      // Expand the cell's text area to fit the entire contents 
      [cell.textLabel sizeToFitFixedWidth:cell.textLabel.frame.size.width]; 

      // Find the new Y-position of where the "Close" button. 
      // The new Y position should be at the bottom of the newly expanded text label 

      CGFloat bottomYPos = cell.textLabel.frame.origin.y + cell.textLabel.frame.size.height; 

      // Get a rect with the "Close" button's frame and new Y position 
      CGRect buttonRect = cell.showAllButton.frame; 
      buttonRect.origin.y = bottomYPos; 

      // Animation block to shift the "Close" button down to its new rect    
      [UIView animateWithDuration:0.3 
            delay:0.0 
           options: UIViewAnimationCurveLinear 
          animations:^{ 
           cell.showAllButton.frame = buttonRect; 
           [cell.showAllButton setTitle:@"Close" forState:UIControlStateNormal]; 
          } 
          completion:^(BOOL finished){ 
           NSLog(@"Done 1!"); 
          }]; 
     } 
     else 
     { 
      // This cell is currently collapsed 

      // Get the button rect and subtract the height delta to put it back 
      // OriginalCellSizes is where I keep track of the original Y positions 
      CGRect buttonRect = cell.showAllButton.frame; 
      buttonRect.origin.y -= cell.frame.size.height - [[originalCellSizes objectAtIndex:indexPath.row] floatValue]; 

      // Animation block for the Button  
      [UIView animateWithDuration:0.3 
            delay:0.0 
           options: UIViewAnimationCurveEaseOut 
          animations:^{ 
           cell.showAllButton.frame = buttonRect; 
           [cell.showAllButton setTitle:@"View More" forState:UIControlStateNormal]; 
          } 
          completion:^(BOOL finished){ 
           NSLog(@"Done! 2"); 
          }]; 
     } 

Po badają, stwierdziliśmy, że w „inny” gałęzi że jeśli-innego, buttonRect jest już w tym samym miejscu i AS pierwotnego położenia . Podejrzewam, że właśnie dlatego nie ma żadnej animacji, ale nie jestem pewien.

Każda pomoc będzie naprawdę świetna!

Odpowiedz

-1

prosty sposób to zrobić ......

[self.tableView beginUpdates]; 
[self.tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationFade]; 
[self.tableView deleteRowsAtIndexPaths:deleteIndexPaths withRowAnimation:UITableViewRowAnimationFade]; 
[self.tableView endUpdates]; 

insertIndexPaths jest tablicą NSIndexPaths być włożona do stolika.

deleteIndexPaths jest tablicą NSIndexPaths do usunięcia z tabeli.

Przykład Format tablicą ścieżek indeksowych:

NSArray *insertIndexPaths = [[NSArray alloc] initWithObjects: 
     [NSIndexPath indexPathForRow:0 inSection:0], 
     [NSIndexPath indexPathForRow:1 inSection:0], 
     [NSIndexPath indexPathForRow:2 inSection:0], 
     nil]; 

dostał go od tego pytania ... this question...

+1

Odpowiedź ta nie ma nic wspólnego z pytaniem, który został poproszony. – Dalmazio

+0

Czy widzisz, że odpowiedź jest akceptowana? –

+2

Tak, i to jest jeszcze bardziej kłopotliwe. – Dalmazio

Powiązane problemy