swift UINavigationBar背景颜色动画

8ehkhllq  于 11个月前  发布在  Swift
关注(0)|答案(1)|浏览(114)

我试图实现苹果的详细屏幕从他们的播客,音乐,和应用程序商店的应用程序。导航栏开始透明,然后增加阿尔法进一步向下滚动。
我通过改变navigationBar本身的alpha值达到了预期的效果。然而,这也会影响navigationBar中的按钮。

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    var offset = scrollView.contentOffset.y / 350
    if offset > 1 {
        offset = 1
        self.navigationController?.navigationBar.alpha = offset
        self.navigationItem.setHidesBackButton(false, animated: false)
    } else {
        self.navigationController?.navigationBar.alpha = offset
        self.navigationItem.setHidesBackButton(true, animated: false)
    }
}

字符串
我觉得我也需要改变
1.导航栏的backgroundColor
1.导航栏的bartTintColor
在实施上述各项并替换时:

self.navigationController?.navigationBar.alpha = offset


self.navigationController?.navigationBar.barTintColor = Color.background?.withAlphaComponent(offset)


self.navigationController?.navigationBar.backgroundColor = Color.background?.withAlphaComponent(offset)


动画没有过渡,它只是从透明到不透明。
我正在使用iOS 13方法在此控制器上设置导航栏

let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
self.navigationController?.navigationBar.standardAppearance = appearance

c90pui9n

c90pui9n1#

要在保持按钮可见性的同时实现平滑过渡导航栏的预期效果,您可以考虑对背景使用Alpha调整并单独操纵按钮的可见性。
我给你个建议

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let offset = scrollView.contentOffset.y / 350
    
    if offset > 1 {
        updateNavigationBar(withAlpha: 1)
        self.navigationItem.setHidesBackButton(false, animated: true)
    } else {
        updateNavigationBar(withAlpha: offset)
        self.navigationItem.setHidesBackButton(true, animated: true)
    }
}

func updateNavigationBar(withAlpha alpha: CGFloat) {
    let backgroundColor = Color.background?.withAlphaComponent(alpha)
    
    // Update background with a fade animation
    UIView.animate(withDuration: 0.3) {
        self.navigationController?.navigationBar.backgroundColor = backgroundColor
    }
    
    // Update only the background alpha without affecting the buttons
    self.navigationController?.navigationBar.alpha = alpha
}

字符串
这将背景透明度的处理(使用淡入淡出动画以实现更平滑的过渡)与导航栏alpha的调整分开,以保持按钮的可见性。根据需要调整动画的持续时间(animate(withDuration:0.3)),以获得所需的效果。

相关问题