2016-06-04 72 views
6

sto cercando di animare l'altezza delle righe tableViewCell chiamando startAnimation() all'interno della funzione tableView:Swift: Come animare la riga Altezza di un UITableView?

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! TableViewCell 

    tableView.rowHeight = 44.0 

    startAnimation(tableView) 

    return cell 
} 

//MARK: Animation function 

func startAnimation(tableView: UITableView) { 

    UIView.animateWithDuration(0.7, delay: 1.0, options: .CurveEaseOut, animations: { 

     tableView.rowHeight = 88.0 

    }, completion: { finished in 

     print("Row heights changed!") 
    }) 
} 

Il risultato: L'altezza delle righe non cambia ma senza alcuna animazione si verifichi. Non capisco perché l'animazione non funzioni. Dovrei forse definire qualche inizio e fine stato da qualche parte?

risposta

11

Non modificare l'altezza in questo modo. Invece, quando si sa che si desidera modificare l'altezza di una cella, chiamata (in qualsiasi funzione):

self.tableView.beginUpdates() 
self.tableView.endUpdates() 

Queste chiamate comunicano al tableView per verificare le modifiche di altezza. Quindi implementare il delegato override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat e fornire l'altezza corretta per ogni cella. Il cambiamento di altezza sarà animato automaticamente. Puoi restituire UITableViewAutomaticDimension per gli articoli per i quali non hai un'altezza esplicita.

Non suggerirei di eseguire tali azioni dall'interno di cellForRowAtIndexPath, tuttavia, ma in uno che risponde a un tap didSelectRowAtIndexPath, ad esempio. In una delle mie classi, faccio:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    if indexPath == self.selectedIndexPath { 
     self.selectedIndexPath = nil 
    }else{ 
     self.selectedIndexPath = indexPath 
    } 
    } 

internal var selectedIndexPath: NSIndexPath? { 
    didSet{ 
     //(own internal logic removed) 

     //these magical lines tell the tableview something's up, and it checks cell heights and animates changes 
     self.tableView.beginUpdates() 
     self.tableView.endUpdates() 
    } 
    } 

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    if indexPath == self.selectedIndexPath { 
     let size = //your custom size 
     return size 
    }else{ 
     return UITableViewAutomaticDimension 
    } 
    } 
1
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! TableViewCell 

    tableView.rowHeight = 44.0 

    UIView.animateWithDuration(0.7, delay: 1.0, options: .CurveEaseOut, animations: { 

     tableView.rowHeight = 88.0 
     cell.layoutIfNeeded() 

    }, completion: { finished in 

     print("Row heights changed!") 
    }) 

    return cell 
}