zoukankan      html  css  js  c++  java
  • NavgationBar随着滑动颜色渐变效果的实现

    上一篇博客说要仿写半糖,框架已经搭好了http://www.cnblogs.com/bcblogs/p/5227522.html,今天来写第一个界面

    首先看了下第一个界面,可以用tableView来实现,当tableView滑动时,navgationbar的颜色从透明开始慢慢变到粉红色

    应该是tableView继承的scrollView,可以在scrollView的代理里面得到tableView滑动的距离,根据距离来改变透明度,so easy

    HomeViewController里的代码

    import UIKit
    
    class HomeViewController: UIViewController {
    
        private var tableView:UITableView!
        
        
        override func viewDidLoad() {
            super.viewDidLoad()
            bulidTableView()
            settingNav()
        }
        
        private func settingNav(){
            //开始时将navigationBar的透明度设置为0
            self.navigationController?.navigationBar.alpha = 0
        }
        private func bulidTableView(){
            self.automaticallyAdjustsScrollViewInsets = false
            tableView = UITableView(frame: CGRectMake(0, 0, ScreenWidth, ScreenHeight-49), style:.Plain)
            tableView.delegate = self
            tableView.dataSource = self
            view.addSubview(tableView)
        }
        
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
        
    }
    
    extension HomeViewController:UITableViewDataSource,UITableViewDelegate,UIScrollViewDelegate{
        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell = UITableViewCell(style:.Default, reuseIdentifier:"cell")
            cell.textLabel?.text = "测试"
            return cell
        }
        
        func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return 20
        }
        
        func scrollViewDidScroll(scrollView: UIScrollView) {
            let y = scrollView.contentOffset.y
            
            if(y <= 0){
                //往上滑动,透明度为0
                self.navigationController?.navigationBar.alpha = 0.0
            }else{
                //滑动到距离为100的时候才显示完全
                if y/100 >= 1{
                    return
                }
                print(y/100)
                self.navigationController?.navigationBar.alpha = (y)/100
            }
        }
    }

    运行效果如图

    好吧,一开始想的简单了(是我想太多),开始的时候设置navgationbar的透明度不起作用,试着在viewwillappear里写,也没有用

    只有在滑动一次之后才有作用,上网找了好久,也不明白这是怎么回事(知道的小伙伴可以评论里告诉我啊),后来还是用了比较蠢得方法

    画一张图片....,代码如下,extension文件夹下,多加个UIColor的扩展

    import UIKit
    
    class HomeViewController: UIViewController {
    
        private var tableView:UITableView!
        
        
        override func viewDidLoad() {
            super.viewDidLoad()
            bulidTableView()
            settingNav()
        }
        
        private func settingNav(){
            //开始时将navigationBar的透明度设置为0
            self.navigationController?.navigationBar.alpha = 0
            
            self.navigationController?.navigationBar.setBackgroundImage(self.imageWitBgColor(UIColor.colorWithCustom(228, g: 57, b: 65, alpha: 0)), forBarMetrics:.Default)
            self.navigationController?.navigationBar.shadowImage = self.imageWitBgColor(UIColor.colorWithCustom(228, g: 57, b: 65, alpha: 0))
            
        }
        
        private func bulidTableView(){
            self.automaticallyAdjustsScrollViewInsets = false
            tableView = UITableView(frame: CGRectMake(0, 0, ScreenWidth, ScreenHeight-49), style:.Plain)
            tableView.delegate = self
            tableView.dataSource = self
            view.addSubview(tableView)
        }
        private func imageWitBgColor(color:UIColor) -> UIImage{
            let rect = CGRectMake(0, 0, 1, 1)
            UIGraphicsBeginImageContext(rect.size)
            let context = UIGraphicsGetCurrentContext()
            CGContextSetFillColorWithColor(context,color.CGColor)
            CGContextFillRect(context,rect)
            let image = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return image
        }
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
        
    }
    
    extension HomeViewController:UITableViewDataSource,UITableViewDelegate,UIScrollViewDelegate{
        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell = UITableViewCell(style:.Default, reuseIdentifier:"cell")
            cell.textLabel?.text = "测试"
            return cell
        }
        
        func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return 20
        }
        
        func scrollViewDidScroll(scrollView: UIScrollView) {
            let y = scrollView.contentOffset.y
            
            if(y <= 0){
                //往上滑动,透明度为0
                self.navigationController?.navigationBar.setBackgroundImage(self.imageWitBgColor(UIColor.colorWithCustom(228, g: 57, b: 65, alpha: 0)), forBarMetrics:.Default)
            }else{
                //滑动到距离为100的时候才显示完全
                if y/100 >= 1{
                    return
                }
                print(y/100)
                self.navigationController?.navigationBar.setBackgroundImage(self.imageWitBgColor(UIColor.colorWithCustom(228, g: 57, b: 65, alpha:y/100)), forBarMetrics:.Default)
            }
        }
    }

    运行效果

    是吧,成功了,但是看到后面,导航栏的颜色太深了,这不符合我这完美主义者啊,所以还是用以前的navgationbar的alpha方法,只是在刚开始时将nav的背景图片设置成透明

    顺便将画图片的方法写进UIImage的扩展

    import UIKit
    
    class HomeViewController: UIViewController {
    
        private var tableView:UITableView!
        
        
        override func viewDidLoad() {
            super.viewDidLoad()
            bulidTableView()
            settingNav()
        }
        
        private func settingNav(){
            //开始时将navigationBar的透明度设置为0
            self.navigationController?.navigationBar.setBackgroundImage(UIImage.imageWitBgColor(UIColor.colorWithCustom(228, g: 57, b: 65, alpha:0)), forBarMetrics:.Default)
            self.navigationController?.navigationBar.shadowImage = UIImage.imageWitBgColor(UIColor.colorWithCustom(228, g: 57, b: 65, alpha:0))
        }
        
        private func bulidTableView(){
            self.automaticallyAdjustsScrollViewInsets = false
            tableView = UITableView(frame: CGRectMake(0, 0, ScreenWidth, ScreenHeight-49), style:.Plain)
            tableView.delegate = self
            tableView.dataSource = self
            view.addSubview(tableView)
        }
        
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
        
    }
    
    extension HomeViewController:UITableViewDataSource,UITableViewDelegate,UIScrollViewDelegate{
        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell = UITableViewCell(style:.Default, reuseIdentifier:"cell")
            cell.textLabel?.text = "测试"
            return cell
        }
        
        func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return 20
        }
        
        func scrollViewDidScroll(scrollView: UIScrollView) {
            let y = scrollView.contentOffset.y
            self.navigationController?.navigationBar.setBackgroundImage(nil, forBarMetrics:.Default)
            self.navigationController?.navigationBar.shadowImage = nil
            
            if(y <= 0){
                //往上滑动,透明度为0
                self.navigationController?.navigationBar.alpha = 0
            }else{
                //滑动到距离为100的时候才显示完全
                if y/100 >= 1{
                    return
                }
                self.navigationController?.navigationBar.alpha = y/100
    
            }
        }
    }

    运行效果

    perfect,成功,感觉写的好慢,不知道猴年马月才能写完了....,写的慢的原因是我写出了自己的想法和写界面的过程,要是直接写正确的代码估计会很快

    ,下一篇估计讲的是网络请求,数据解析和cocoapods吧..

  • 相关阅读:
    c++命名空间重命名
    ssh保持长连接的配置方法
    macos平台上使用 sed
    c++的使用
    NAT介绍以及穿透各种类型nat的技术实现包括对称型nat
    组态图绘制软件的实现
    关于五防系统
    Linux的应用
    java常用包及其类概述
    springboot整合redis
  • 原文地址:https://www.cnblogs.com/bcblogs/p/5230052.html
Copyright © 2011-2022 走看看