【问题标题】:UINavigationBar that changes transparency when scrolling滚动时更改透明度的 UINavigationBar
【发布时间】:2014-12-22 17:10:33
【问题描述】:

我正在尝试实现UINavigationBar,它在滚动UITableView 时会改变其透明度。一开始导航栏的背景应该是透明的,所以它下面的内容应该是可见的(会有图片显示,比如我用的是纯色):

当用户滚动表格视图时,透明度应该被替换为纯色:

表格视图将包含部分标题,这应该像使用非半透明导航栏时一样。标题视图一旦从底部“触摸”导航栏,就应该“粘贴”到导航栏:

我没有运气尝试在 iOS 应用程序中实现此流程。

对于初始状态,我将UINavigationBartranslucent 属性设置为YES,并将backgroundColorbarTintColor 设置为清除颜色,这给了我想要的。

然后,当用户滚动表格视图时,我将 backgroundColorbarTintColor 更新为具有给定 alpha 分量的颜色,根据当前滚动偏移量计算。我正在使用来自UIScrollViewDelegate 协议的scrollViewDidScroll: 来执行此操作。但是,它只改变了导航栏的背景,使状态栏背景透明,这不是我想要的。

如果不将translucent 属性设置为YES,我找不到另一种使UINavigationBar 透明的方法。不幸的是,这会改变部分标题在滚动时的行为方式。由于导航栏是半透明的,当部分标题视图应该像上面第三个屏幕截图一样“粘”在栏上时,它们会隐藏在其下方。

对于如何实现与 Objective-C 或 Swift 中描述或类似的导航栏的任何帮助和提示,我将不胜感激。

【问题讨论】:

  • 嘿检查LTNavigationbar这可能会有所帮助。
  • 谢谢@Prince!!很棒的发现!
  • 一直在寻找 @PareshNavadiya 非常感谢。
  • 您找到解决方案了吗?

标签: ios uitableview uinavigationbar


【解决方案1】:

假设您对 tableView 上方的视图有一个引用,并且您不想与其中的任何内容进行交互:

var overlayView:UIView!
var offsetDenominator:CGFloat!
let TARGER_COLOR = UIColor.blackColor()

override func viewDidLoad() {
    super.viewDidLoad()

    if let navCtrl = self.navigationController {
        self.offsetDenominator = headerView.frame.size.height - navCtrl.navigationBar.frame.height

        let targetCIColor = CIColor(CGColor: self.TARGER_COLOR.CGColor)
        let overlayColor = UIColor(red: targetCIColor.red, green: targetCIColor.green, blue: targetCIColor.blue, alpha: 0.0)

        self.overlayView = UIView(frame: self.headerView.frame)
        self.overlayView.backgroundColor = overlayColor

        self.view.addSubview(self.overlayView)
    }

...

override func scrollViewDidScroll(scrollView: UIScrollView) {
    if let navCtrl = self.navigationController, let breakpoint = offsetDenominator {
        let alpha = scrollView.contentOffset.y / breakpoint

        if alpha >= 1.0  {
            navCtrl.navigationBar.backgroundColor = self.TARGER_COLOR
        } else {
            let targetCIColor = CIColor(CGColor: self.TARGER_COLOR.CGColor)
            let overlayColor = UIColor(red: targetCIColor.red, green: targetCIColor.green, blue: targetCIColor.blue, alpha: alpha)

            self.overlayView.backgroundColor = overlayColor
            navCtrl.navigationBar.backgroundColor = UIColor.clearColor()
        }
    }
}

【讨论】:

    【解决方案2】:

    我的做法是:

    override func viewDidLoad() {
        super.viewDidLoad()
        ...
        self.setNavbarTransculent()
    }
    
    private func setNavbarTransculent() {
        self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
        self.navigationController?.navigationBar.shadowImage = UIImage()
        self.navigationController?.navigationBar.isTranslucent = true
    }
    
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let denominator: CGFloat = 50 //your offset treshold
        let alpha = min(1, scrollView.contentOffset.y / denominator)
        self.setNavbar(backgroundColorAlpha: alpha)
    }
    
    private func setNavbar(backgroundColorAlpha alpha: CGFloat) {
        let newColor = UIColor(red: 1, green: 1, blue: 1, alpha: alpha) //your color
        self.navigationController?.navigationBar.backgroundColor = newColor
        UIApplication.shared.statusView?.backgroundColor = newColor
    }
    
    extension UIApplication {
        var statusView: UIView? {
            return value(forKey: "statusBar") as? UIView
        }
    }
    

    【讨论】:

    • 线程 1:“在 UIApplication 上调用 -statusBar 或 -statusBarWindow 的应用程序:必须更改此代码,因为不再有状态栏或状态栏窗口。改用窗口场景中的 statusBarManager 对象。”
    【解决方案3】:

    Swift3

    var navAlpha = // Your appropriate calculation   
    self.navigationController!.navigationBar.backgroundColor =  UIColor.red.withAlphaComponent(navAlpha)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      相关资源
      最近更新 更多