2016-07-05 15 views
0

ウィジェットを行います。アニメーションでセルの高さを変更する必要があります。 「もっと見る」をクリックすると、追加のコントロールが表示されます。 enter image description hereUITableViewセル高さアニメーション

私はこのコード

 tableView.beginUpdates() 
     showModes(alpha: 1, duration: 0.2, delay: 0.1) 
     tableView.endUpdates() 

func showModes(alpha: CGFloat, duration: CGFloat, delay: CGFloat) { 
    if tableView.numberOfRows(inSection: 0) != 0 { 
     for i in 0...tableView.numberOfRows(inSection: 0)-1 { 
      let indexPath = IndexPath(row: i, section: 0) 
      if let cell = tableView.cellForRow(at: indexPath) as? WidgetCell { 
       UIView.animate(withDuration: TimeInterval(duration), delay: TimeInterval(delay) ,animations: { 
        if alpha == 0 { 
         cell.favoriteConstraint.constant = -45 
        } else { 
         cell.favoriteConstraint.constant = 10 
        } 
        cell.favoriteMode.alpha = alpha 
        self.tableView.layoutIfNeeded() 
       }) 

      } 
     } 
    } 
} 

を書いたしかし、それはスムーズに動作しません。それは劇的に上下にツイッチします。 Appleの天気ウィジェットなどで、これをスムーズに動作させるにはどうすればよいですか?

答えて

0

コードの一部だけを投稿したため、何が問題なのか分かりません。しかし、私はいくつかの小切手を提案することができます

  1. あなたはUITableViewのセルフサイジングセルを設定しましたか? AtableView.rowHeight = UITableViewAutomaticDimension;
  2. 制約をアニメーション化するアニメーションクロージャ内でそれを変更する必要はありません変更されたとき、あなたはまた、セルのcontentViewへ

を制約(favoriteConstraint)を追加しました。

標準コードは

cell.favoriteConstraint.constant = newValue 
    UIView.animateWithDuration(0.3) { 
    cell.contentView.layoutIfNeeded() 
} 

のように見えます。また、あなたのメソッドの呼び出しをラップする必要はありません。これはOKでなければならない:

showModes(alpha: 1, duration: 0.2, delay: 0.1) 
tableView.beginUpdates()  
tableView.endUpdates() 
+0

はい、それはすべてのviewDidLoad funcを オーバーライドを追加(){ super.viewDidLoad() ledControllers = readLED() self.tableView.estimatedRowHeight = 300 self.tableView.rowHeight = UITableViewAutomaticDimension } ビデオを録画してより明瞭にしました。最初のセルが展開され、アニメーションが開始されます。私はそれが天気予報ウィジェットのようだったと思う。 https://youtu.be/f4D7NnoyWrQ P.S. Судяпоникувыговоритепорусски? – MacSergey

関連する問題