2017-09-23 70 views
0

我在顯示視頻的UIViewController中有一個UITableView。當我向下滾動時,我想動畫從一個大標題移動到一個小標題。我目前使用的代碼是:iOS 11動畫largeTitleDisplayMode

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
     if #available(iOS 11.0, *) { 
      UIView.animate(withDuration: 0.35, animations: { 
       if scrollView.contentOffset.y <= 128 { 
        self.navigationItem.largeTitleDisplayMode = .always 
       } else { 
        self.navigationItem.largeTitleDisplayMode = .never 
       } 
      }) 
     } 
    } 

但是它在轉換時看起來很跳躍。什麼是更好的方式來做到這一點?

+2

你不應該需要做的。滾動時,標題應自動從小到大或反之亦然。 – matt

+0

雖然沒有。這可能是因爲我在UIViewController中使用了一個UItableview – Minebomber

+0

你應該使用UITableViewController來處理這種情況,如果你不想使用它,看看我的答案 –

回答

0

如果你符合的UITableViewDelegate添加以下代碼:

var canTransitionToLarge = false 

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    func animate(){ 
     self.navigationController?.navigationBar.setNeedsLayout() 
     self.view.setNeedsLayout() 
     UIView.animate(withDuration: 0.25, animations: { 
      self.navigationController?.navigationBar.layoutIfNeeded() 
      self.view.layoutIfNeeded() 
     }) 
    } 
    if canTransitionToLarge && scrollView.contentOffset.y <= 0 { 
     self.navigationItem.largeTitleDisplayMode = .always 
     animate() 
     canTransitionToLarge = false 
    } 
    else if !canTransitionToLarge && scrollView.contentOffset.y > 0 { 
     self.navigationItem.largeTitleDisplayMode = .never 
     animate() 
     canTransitionToLarge = true 
    } 
} 

如果不符合的UITableViewDelegate添加ScrollViewDelegate到你的ViewController:

class ViewController: UIViewController, UIScrollViewDelegate