UINavigationBar在滚动时改变透明度

Dar*_*ski 17 uinavigationbar uitableview ios

我正在尝试实现UINavigationBar在滚动时更改其透明度UITableView.开始时,导航栏应该具有透明背景,因此其下方的内容应该是可见的(将显示图像,例如我使用纯色):

例1

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

例2

表视图将包含节标题,这些标题应该像使用非半透明导航栏时一样.一旦从底部"触摸"它,标题视图应"粘贴"到导航栏:

例3

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

对于初始状态,我将UINavigationBar translucent属性设置为YES,以及两者backgroundColorbarTintColor清除颜色,这给了我想要的东西.

然后,当用户滚动表视图时,我正在更新backgroundColorbarTintColor使用给定alpha分量的颜色,基于当前滚动偏移计算.我使用scrollViewDidScroll:UIScrollViewDelegate协议来这样做.但是,它仅更改导航栏的背景,使状态栏背景保持透明,这不是我想要的.

UINavigationBar没有设置translucent属性我找不到透明的另一种方法YES.不幸的是,这会改变滚动时节标题的行为方式.由于导航栏是半透明的,当它们应该像上面的第三个屏幕截图那样"粘住"到条形时,部分标题视图隐藏在它下方.

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

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