iOS 11 动画大标题显示模式

Min*_*ber 0 uitableview ios swift ios11

我在 UIViewController 中有一个 UITableView 显示视频。当我向下滚动时,我想制作从大标题到小标题的动画。我目前使用的代码:

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
                }
            })
        }
    }
Run Code Online (Sandbox Code Playgroud)

但过渡时显得很神经质。有什么更好的方法来做到这一点?

Jon*_*ano 5

如果您符合 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

class ViewController: UIViewController, UIScrollViewDelegate 
Run Code Online (Sandbox Code Playgroud)