Giter VIP home page Giter VIP logo

gknavigationbarswift's Introduction

GKNavigationBarSwift

GKNavigationBar的Swift版本 - iOS自定义导航栏,为你的每个控制器添加导航栏

Build Status License MIT platform languages cocoapods Carthage compatible Swift Package Manager compatible support

介绍:(本框架的特性)

  • 无侵入性,低耦合性
  • 支持自定义导航栏样式(隐藏、透明等)
  • 支持控制器开关返回手势
  • 支持控制器开关全屏返回手势
  • 支持控制器设置导航栏透明度,可实现渐变效果
  • 完美解决UITableView,UIScrollView滑动手势冲突
  • 可实现push,pop时控制器缩放效果(如:今日头条)
  • 可实现左滑push一个控制器的效果(如:网易新闻)

重要!!!

感谢使用该库,如果在使用过程中遇到问题可查看issue或提交issue,或者进QQ群1047100313

1、如果想要在控制器中动态改变状态栏样式,需要在基类控制器实现下面的方法

override var prefersStatusBarHidden: Bool {
    return self.gk_statusBarHidden
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return self.gk_statusBarStyle
}

2、如果切换控制器的时候出现状态栏显示异常(一半黑一半白等) 解决办法:在控制器初始化方法里面设置状态栏样式

// 最好在初始化方法中设置gk_statusBarStyle,否则可能导致状态栏切换闪动问题
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    
    self.gk_statusBarStyle = .lightContent
}

3、Xcode 11.4 在调试的时候会出现不自动调用awake方法 解决办法:APP启动的时候调用GKConfigure.awake()方法,1.4.6版本修改了加载时机可不用手动调用此方法了

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    
    GKConfigure.awake()
}

使用说明

1、在AppDelegate中添加导航配置

GKConfigure.setupDefault()

2、创建根导航控制器

let nav = UINavigationController(rootVC: GKMainViewController())
nav.gk_openScrollLeftPush = true // 开启左滑push

3、设置导航栏属性(调用即创建)

self.gk_navBackgroundColor = [UIColor red]

更多属性及方法可在demo中查看

效果图

demo

版本记录

  • 1.6.5 - 2023.10.13 适配iOS17,修复非全屏bug
  • 1.6.4 - 2023.07.21 消除警告,SPM优化
  • 1.6.1 - 2023.07.17 修复导航栏间距调整可能失效问题
  • 1.6.0 - 2023.06.28 导航栏宽度适配Mac
  • 1.5.9 - 2023.03.29 1、修复获取keyWindow崩溃问题 2、push、pop转场动画优化 3、修复导航栏间距调整bug
  • 1.5.8 - 2022.12.27 修复某些情况下控制器无法释放的问题 #26 #27
  • 1.5.6 - 2022.09.29 移除导航栏上的点击事件
  • 1.5.5 - 2022.09.16 导航栏高度适配iPhone14系列新设备
  • 1.5.4 - 2022.08.22 修复iOS13之前设置背景色、分割线颜色不生效问题
  • 1.5.3 - 2022.08.18 修复侧滑返回时可能出现导航栏间距不准确问题
  • 1.5.2 - 2022.08.16 屏蔽GKNavigationBar的touches事件和tap事件
  • 1.5.1 - 2022.07.29 1、增加返回手势与其他手势冲突处理代理方法 2、当只设置gk_backImage时处理优化 3、解决当子控制器添加导航栏时设置导航栏间距无效的问题
  • 1.5.0 - 2022.06.22 修复编译报错问题 #20
  • 1.4.7 - 2022.06.14 1、awake方法修改为配置时加载,可不用手动调用 2、获取当前控制器方法优化 3、导航栏添加时机优化
  • 1.4.5 - 2022.04.20 修复导航栏设置透明的bug
  • 1.4.4 - 2022.04.15 导航栏设置适配iOS13之后
  • 1.4.3 - 2022.03.30 修复最新版xcode编译报错问题
  • 1.4.2 - 2022.03.27 模拟器获取设备型号优化,内部代码优化
  • 1.4.0 - 2022.03.23 优化代码,同步oc版本,修复已知问题
  • 1.3.1 - 2020.12.25 修复边缘手势无效的bug
  • 1.3.0 - 2020.12.24 手势处理优化,解决可能出现的卡死问题 #10,push、pop手势灵敏度优化
  • 1.2.6 - 2020.12.06 导航栏间距调整优化,手势处理优化
  • 1.2.5 - 2020.12.01 修复可能出现卡死的bug
  • 1.2.4 - 2020.11.27 手势处理优化,bug修改
  • 1.2.3 - 2020.11.16 修复切换根控制器后不能释放的bug
  • 1.2.2 - 2020.11.16 修复iOS12机型设置导航栏按钮间距无效的bug,增加返回手势拦截demo
  • 1.2.0 - 2020.10.27 优化代码宏定义,增加自定义转场demo
  • 1.1.8 - 2020.10.22 适配iPhone 12机型,增加自定义转场动画属性
  • 1.1.5 - 2020.08.14 修复屏蔽控制器无效的bug
  • 1.0.3 - 2020.07.30 增加某些控制器对导航栏间距调整的影响
  • 1.0.2 - 2020.07.27 修复交换方法可能导致的crash问题
  • 1.0.0 - 2020.07.22 优化手势处理,增加属性可屏蔽某些控制器对手势处理的影响
  • 0.0.9 - 2020.07.16 增加gk_backImage,可自定义导航栏返回按钮图片
  • 0.0.7 - 2020.06.22 设置导航栏间距不再局限于GKNavigationBar
  • 0.0.6 - 2020.06.18 修复设置导航栏item间距的bug
  • 0.0.4 - 2020.04.18 修复设置标题文字颜色及大小可能无效的情况
  • 0.0.3 - 2020.04.12 优化对UIScrollView手势的处理
  • 0.0.1 - 2020.04.12 初始版本,支持Cocoapods,Carthage,SPM

gknavigationbarswift's People

Contributors

quintgao avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

gknavigationbarswift's Issues

UINavigationBar 未隐藏

按照教程配置的方法进行了配置,但发现系统的UINavigationBar为隐藏,遮挡住了GKNavigationBar

加QQ群,群号找不到。

(内存泄漏)切换根视图后,之前的控制器不会被销毁

设置登录页为根视图

let rootvc = UINavigationController(rootVC: NATSignInController.init())
rootvc.gk_openScrollLeftPush = true
self.changeRootViewController(rootvc)

登录成功后,切换首页为根视图,NATSignInController没有调用deinit方法。
如果我把let rootvc = UINavigationController(rootVC: NATSignInController.init())换成系统APIlet rootvc = UINavigationController.init(rootViewController: NATSignInController.init())。切换首页为根视图后,登录控制器调用了deinit方法。

侧滑返回失效

侧滑返回失效。我集成了之后使用默认配置GKConfigure.setupDefault(),但是我再页面里面如果使用了self.gk_navigationItem.title = "详情"self.gk_statusBarStyle = .default但是我在这个页面侧滑返回失效,使用系统的可以

自己做一个滑动tableview显示gk_navTitle的问题

我目前要实现一个类似系统的滑动tableview显示title的功能,我在模拟器上是没有问题的,但是在真机上的时候发现self.gk_navTitle重新赋值没有效果。排查了一下没有找到原因,希望得到帮助。
xcode版本:14.3
GKNavigationBarSwift (1.5.9)
iOS:16.0
代码如下:

    var isLargeTitleHidden: Bool = false {
        didSet{
            if (oldValue != isLargeTitleHidden){
                updateNavBar()
            }
        }
    }


    func updateNavBar(){
        let fadeTextAnimation = CATransition()
        fadeTextAnimation.duration = 0.2
        fadeTextAnimation.type = CATransitionType.fade
        gk_navigationBar.layer.add(fadeTextAnimation, forKey: "fadeText")
        
        if isLargeTitleHidden {
            self.gk_navTitle = self.headerLabel.text
        } else {
            gk_navTitle = ""
        }
    }
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        
        print(scrollView.contentOffset)
        
        let bottom = headerLabel.bottom
        
        if scrollView.contentOffset.y > bottom + 5 {
            isLargeTitleHidden = true
        }else{
            isLargeTitleHidden = false
        }   
    }

在Storyboard上控件约束Safe Area.top为44,实际效果控件和导航底部有个5pt的间距

iPhone15模拟器

我看到_UINavigationBarContentView的frame是<_UINavigationBarContentView: 0x10466e6f0; frame = (0 54; 393 44); layer = <CALayer: 0x6000002a0de0>> layout=0x104662020。
而在在Storyboard上控件约束Safe Area.top为0时,控件的y为59

系统导航<_UIVisualEffectBackdropView: 0x105919050; frame = (0 0; 393 103);
GKNavigationBarSwift:<GKNavigationBarSwift.GKNavigationBar: 0x10595dfc0; baseClass = UINavigationBar; frame = (0 0; 393 98);

刚想到新机型状态栏和SafeAreaTop高度是不一样的 状态栏是54、SafeAreaTop是59

返回手势设置无效

 gk_interactivePopDisabled = false // 禁止滑动(true - 禁止)
 gk_fullScreenPopDisabled = false  // 禁止全屏滑动,支持边缘滑动 (true - 禁止)
 
 
 在ViewController设置,没有手势返回

 xcode 运行不起来

error opening input file '/Users/gaokun/mine/GKNavigationBarSwift/Example/Example/Example-Bridging-Header.h' (No such file or directory)
:0: error: cannot open file '/Users/didi/Library/Developer/Xcode/DerivedData/GKNavigationBarSwift-fakrnjgeyfspgmdvquqnytjklrml/Build/Intermediates.noindex/PrecompiledHeaders/Example-Bridging-Header-1RRN7IVVY697J.dia' for diagnostics emission (No such file or directory)

self.navigationController?.navigationBar.isTranslucent = false; 无效

但我使用 这个第三方时,导航栏会遮挡view,这时设置 self.navigationController?.navigationBar.isTranslucent = false; 是没有作用。
我查看demo中是设置view的顶部距离视图顶部 导航栏高度+状态栏高度。
有没有办法可以不用设置距离,直接就让 self.navigationController?.navigationBar.isTranslucent = false; 起作用

点击导航栏会触发touchesBegan事件

嵌套导航栏的控制器中,点击导航栏会执行touchesBegan中的print,试了下系统自带导航栏就不会。
override func touchesBegan(_ touches: Set, with event: UIEvent?) {
print("点击导航栏...")
}

后退按钮图标坐标会跳动

场景:
点击 tableCell 弹出 UIAlertController,在 present 出 UIAlertController 时,gk_navLeftBarButtonItem 对应的 UIBarButtonItem 的图标坐标会往左移动一点距离,这个在之前的版本中没有出现过这个问题(之前用的 1.4.3)

用了 GKNavigationBar 的页面 setNavigationBarHidden 设置无效了

如题,用了 GKNavigationBar 的页面 setNavigationBarHidden 设置无效

现象:
没有使用 GKNavigationBar 的 UIViewController 中调用 setNavigationBarHidden 正常
使用了 GKNavigationBar 的 UIViewController 中调用 setNavigationBarHidden 无效

Swift: 5.0
iOS: 15
Xcode: 13.4

设置gk_statusBarStyle无效

if ZZZ_SleepManager.manager.startSleep(){
let rootVC = ZZZ_SleepContentViewController()
rootVC.dissMissBlock = {
ZZZ_SleepMaskAlertView.init(frame: .zero, startT: ZZZ_SleepManager.manager.startTime!, endT:ZZZ_SleepManager.manager.endTime!).zzz_Show()

        }

// let vc = UINavigationController(rootVC: rootVC)
rootVC.modalPresentationStyle = .fullScreen
self.present(rootVC, animated: true)
}
如果用// let vc = UINavigationController(rootVC: rootVC) 设置就会失效,但是demo没有这种情况

切换控制器,状态栏白色一闪而过

1648208164173311.mp4

奇怪,一样的代码,另外一个界面,都不会

也在基类控制器写了下面代码,还是会出现
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)

self.gk_statusBarStyle = .lightContent

}

iOS15 导入后,系统nav的item抖动问题

导入库以后,按照教程导入了初始化代码 系统nav的item进入后就抖动到最边边上,非常明显。

        GKConfigure.awake()
        GKConfigure.setupCustom { (configure) in

            if #available(iOS 13.0, *) {

                if UITraitCollection.current.userInterfaceStyle == .light{
                    configure.titleColor = .black
                    configure.backStyle = .black
                    configure.backgroundColor = .white
                    SnailTheme.switchNight(isToNight: false)

                }else{
                    configure.titleColor = .white
                    configure.backStyle = .white
                    configure.backgroundColor = UIColor.colorWithHexString(hex: "#1C1C1E", alpha: 1)
                    SnailTheme.switchNight(isToNight: true)

                }
            } else {
                configure.titleColor = .black
                configure.backStyle = .black
                configure.backgroundColor = .white

            }
            configure.titleFont = UIFont.systemFont(ofSize: 18.0)

        }

不知道为什么系统的UINavigationbar和GKNavigationBar共存

截屏2023-06-25 09 53 38
版本是
GKNavigationBarSwift (1.5.9)

    GKConfigure.setupCustom {

            $0.backgroundColor = .white
            
            $0.backImage = UIImage(named: "ic_bk")
            // 导航栏标题颜色
            $0.titleColor = .black
            // 导航栏标题字体
            $0.titleFont = .systemFont(ofSize: 18)
            // 导航栏返回按钮样式
            $0.backStyle = .black
            // 状态栏样式
            $0.statusBarStyle = .`default`
            // 导航栏左右item间距
            $0.gk_navItemLeftSpace = 10
            $0.gk_navItemRightSpace = 10
            // 是否恢复系统导航
            $0.gk_restoreSystemNavBar = false
            $0.gk_hidesBottomBarWhenPushed = true
            // 缩放配置
//            $0.gk_translationX = 15
//            $0.gk_translationY = 20
            $0.gk_scaleX = 0.90
            $0.gk_scaleY = 0.92
            // 开启全局UIScrollView处理
            $0.gk_openScrollViewGestureHandle = true
        }
        

添加childController,这个childController也会存在系统的bar

        childController.tabBarItem.image = normalImage?.withRenderingMode(.alwaysTemplate)
        childController.tabBarItem.selectedImage = selectedImageName?.withRenderingMode(.alwaysTemplate)
        childController.tabBarItem.title = title
        
        let nav = UINavigationController(rootVC: childController)
        nav.gk_openScrollLeftPush = true
        addChild(nav)

push到下一个界面

        let vc = xxxx()
        vc.hidesBottomBarWhenPushed = true
        self.navigationController?.pushViewController(vc, animated: true)

出问题界面设置代码

        self.gk_navTitle = "个人信息"
        self.gk_navLineHidden = false
        self.gk_navBackgroundColor = UIColor.hexColor(hex: "#F5F7F7")

返回手势无效的问题

extension UINavigationController {
// 创建便利构造函数为UINavigationcontroller增加初始化方法
public convenience init(rootVC: UIViewController) {
self.init()
gk_openGestureHandle = true
gk_transitionScale = false
pushViewController(rootVC, animated: true)
}
}
如果不用这个init方法 该怎么实现侧滑返回

内存泄漏控制器不释放

引入GKNavigationBarSwift框架 项目途中切换window的根导航控制器,原先的导航控制器会销毁,但是其栈区里面的子控制器不会销毁,移除框架,控制器一切正常销毁无内存泄漏。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.