Skip to content
/ NNNavigationBar Public
  • Notifications You must be signed in to change notification settings
  • Fork 43
  • Star 243

NNNavigationBar 实现导航条背景渐变过渡动画的轻量级框架

License

243 stars 43 forks Branches Tags Activity
Star
Notifications You must be signed in to change notification settings

amisare/NNNavigationBar

Branches Tags

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

166 Commits
Example
Example
 
 
NNNavigationBar.xcodeproj
NNNavigationBar.xcodeproj
 
 
NNNavigationBar.xcworkspace
NNNavigationBar.xcworkspace
 
 
NNNavigationBar
NNNavigationBar
 
 
NNNavigationBarTests
NNNavigationBarTests
 
 
Pods
Pods
 
 
Supporting Files
Supporting Files
 
 
.gitignore
.gitignore
 
 
LICENSE
LICENSE
 
 
NNNavigationBar.podspec
NNNavigationBar.podspec
 
 
Podfile
Podfile
 
 
Podfile.lock
Podfile.lock
 
 
README.md
README.md
 
 

Repository files navigation

NNNavigationBar

GitHub release CocoaPods CocoaPods GitHub license

本库用于实现UINavigationBar背景渐变过渡动画。

可能会遇到的问题

UINavigationBar 上的一个系统 bug ( An apple bug on the UINavigationBar)

bug 描述:导航右滑返回手势,概率性的导致返回以后页面的 rightBarButtonItem 的 tintColor 颜色变浅, bug 现象如下:

wx20181226-142113

bug 代码:

  • 在 viewDidLoad 中设置 rightBarButtonItem 会导致 bug 产生。bug 是概率性发生的,不易复现。
    override func viewDidLoad() {
        super.viewDidLoad()

        // 在 viewDidLoad 中设置 rightBarButtonItem
        self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(title: "Next", style: .plain, target: self, action: #selector(pushNextViewController))
        self.view.backgroundColor = UIColor.white
        self.title = "Title" + " " + "\(self.page)"
    }

    @objc public func pushNextViewController() {
        let vc = self.nextViewController;
        vc.page = self.page + 1
        self.navigationController?.pushViewController(vc, animated: true)
    }

bug 解决:

  • 方式2:在 viewWillAppear 中设置 rightBarButtonItem 。
    override func viewDidLoad() {
        super.viewDidLoad()
        
       // 将 rightBarButtonItem 设置移至 viewWillAppear
       // self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(title: "Next", style: .plain, target: self, action: #selector(pushNextViewController))
        self.view.backgroundColor = UIColor.white
        self.title = "Title" + " " + "\(self.page)"
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
       // 在 viewWillAppear 中设置 rightBarButtonItem
        self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(title: "Next", style: .plain, target: self, action: #selector(pushNextViewController))
    }
    
    @objc public func pushNextViewController() {
        let vc = self.nextViewController;
        vc.page = self.page + 1
        self.navigationController?.pushViewController(vc, animated: true)
    }
  • 方法2: issues12

bug 工程源码: UINavigationBarBug

效果

ColorTransition ImageTransition

介绍

NNNavigationBar是实现导航条背景渐变过渡动画的轻量级代码库。

实现

  • 代码库通过Category/Method Swizzling方式hook UINavigationBar的方法调用,实现导航条背景渐变过渡动画。

轻量

  • 仅对UINavigationBar进行了Method Swizzling方法混淆。不涉及其它类的方法混淆,如UIViewController、UINavigationController等。
  • 仅对UINavigationBar/UINavigationItem进行了必要的属性关联。

原理



                              UINavigationItem (category_xxx)
                                           |
                                           |
                                           V
                                           ①  
                                     add [.nn_xxx]
                                           |                         UIViewController
                                           |  ------------------->  [.navigationItem]
                                                                             |
                                                                             |
                                                                             V
                                                                             ② 
                                                               set vcn.navigationItem.nn_xxx
                                                                             |
                                                                             |
                                                                             |
                                 UINavigationController                      V
                                       vc stack                              ③            
                                 |        vcn        | <----- navigationController push/pop vcn
                                 |        ...        |                       |
                                 |        vc1        |                       |
                                 |        vc0        |                       |          
                                                                             |
     UINavigationBar                                                         |
-----------------------                                                      |
| <——    title        |                                                      |
-----------------------                                                      |
           |                                                                 |
           |                     UINavigationBar.Items                       V
           |        ④-②              item stack                           ④-①
           |<--- update Bar --- | vcn.navigationItem | <--- navigationBar push/pop vcn.navigationItem
           |          |         |        ...         |                       |
           |          |         | vc2.navigationItem |                       |
           |          |         | vc1.navigationItem |                       |
           |          |         | vc0.navigationItem |                       |
           |          |                                                      |
           |          |                        ④-③                          |
           |          |--------------------->  hook  <-----------------------|
           |                                    |
           |                                    |
           |                                    |
           |             ⑤                     |
           |<--- update Bar [.nn_xx] -----------|
                                                      
  1. 使用runtime在UINavigationItem的Category中添加属性[.nn_xx]。
  2. 每个UIViewController中都拥有一个UINavigationItem属性navigationItem,在UIViewController中修改navigationItem对象的属性[.nn_xx]。
  3. 在UINavigationController push/pop UIViewController时,会将UIViewController的navigationItem对象 push/pop 给UINavigationBar。
  4. 通过Method Swizzling方式hook UINavigationBar方法调用,获得对应方法的调用时机。
  5. 在合适的时刻,UINavigationBar取得navigationItem对象中的属性[.nn_xx],更新UINavigationBar状态(本代码库实现了背景的平滑渐变过渡)。

使用

  1. 导入头文件
#import "NNNavigationBar.h"
  1. 颜色渐变过渡
- (void)viewDidLoad {
    [super viewDidLoad];
    // 去除系统背景
    [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
    [self.navigationController.navigationBar setShadowImage:[UIImage new]];
    // 显示自定义背景
    self.navigationController.navigationBar.nn_backgroundViewHidden = false;
    // 设置背景颜色
    self.navigationItem.nn_backgroundColor = [UIColor orangeColor];
}
  1. 图片渐变过渡
- (void)viewDidLoad {
    [super viewDidLoad];
    // 去除系统背景
    [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
    [self.navigationController.navigationBar setShadowImage:[UIImage new]];
    // 显示自定义背景
    self.navigationController.navigationBar.nn_backgroundViewHidden = false;
    // 设置背景图片
    self.navigationItem.nn_backgroundImage = [UIImage imageNamed:xx_image];
}
  1. 更多使用,详见demo

安装

通过 CocoaPods 集成

安装最新版的 CocoaPods:

$ gem install cocoapods

podfile 中添加:

pod 'NNNavigationBar', '~> 2.7.3'

然后在终端执行:

$ pod install

如安装失败,提示:

[!] Unable to find a specification for `NNNavigationBar`

尝试使用命令:

pod install --repo-update

通过 Carthage 集成

Carthage 是一个去中心化的依赖管理器,用于构建依赖和提供二进制 Framework 。

可以通过以下 Homebrew 命令安装 Carthage :

$ brew update
$ brew install carthage

通过 Carthage 将 NNNavigationBar 集成到 Xcode 项目中,需要在 Cartfile 中添加:

github "amisare/NNNavigationBar" ~> 2.7.3

执行 carthage 构建 Framework ,并将 NNNavigationBar.framework 添加到 Xcode 项目中。

系统要求

  • iOS 8.0+

鸣谢

  • Logo designed by anharismail

许可证

NNNavigationBar 是基于 MIT 许可证下发布的,详情参见 LICENSE。

Releases 14

2.7.3 Latest
Feb 25, 2020
+ 13 releases

Packages

No packages published

Languages

  • Objective-C 66.4%
  • Swift 31.8%
  • Ruby 1.8%

Footer

© 2024 GitHub, Inc.

玻璃钢生产厂家江苏玻璃钢景观雕塑广东玻璃钢卡通雕塑阿狸定制蚂蚁美陈商场视频北京玻璃钢花盆研发公司武义公园玻璃钢雕塑吉林玻璃钢小羊动物雕塑保山市玻璃钢雕塑设计哪里有卖青岛公园玻璃钢雕塑定做晋江市玻璃钢抽象人物雕塑达州玻璃钢卡通雕塑价格池州佛像玻璃钢雕塑多少钱白银玻璃钢雕塑公司上海特色商场美陈现价新年商场美陈布置商场美陈空缺萍乡玻璃钢雕塑加工玻璃钢抽象雕塑摆件亲子玻璃钢雕塑西安大型玻璃钢雕塑销售电话鞍山玻璃钢雕塑多少钱四会玻璃钢花盆花器玻璃钢雕塑喷漆的流程北京商场节日活动美陈布置天津仿铜玻璃钢雕塑多少钱定制玻璃钢雕塑便宜贵阳商场圣诞美陈哪家强宣城抽象玻璃钢雕塑通州玻璃钢雕塑加工促销玻璃钢品牌ip雕塑商丘仿古玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化