ios开发框架封装(四):封装BaseViewController基类,处理返回按钮样式

432 阅读2分钟

先放demo地址:github.com/KeWangKW/99…

  • 理论上swift和OC不能相互继承,但可通过 侨接文件 或者 NSObject 侨接实现
  • 实现起来确实挺恶心的,所以还是封装两套吧
  • swift-----KSViewController
  • OC-----KOViewController
  • 从此,项目内所有创建的ViewController 都将继承自 KSViewController 或 KOViewController

基类中做的处理:

1. 在 swift中 deinit 【等同于OC的 delloc】方法中,控制台打印了当前类名,作为退出当前页面的一个提示

截屏2023-06-25 10.49.02.png

2. 修改导航栏返回按钮
  • 可直接自定义 backBarButtonItem 替换实现,我以下的实现方式是修改系统样式实现

  • 原系统样式为:

    截屏2023-06-25 10.53.09.png

  • 修改返回按钮的图片:

    • self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "fanhui")
    • self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "fanhui")
    • 需同时设置backIndicatorImage 和 backIndicatorTransitionMaskImage,backIndicatorImage是默认展示,而backIndicatorTransitionMaskImage是选中状态下的展示,同时设置可以确保返回按钮在所有情况下都应用你指定的图像
  • 修改图片后样式如下: 截屏2023-06-25 10.55.27.png

  • 去掉返回按钮后面的文字 ,未设置navigationItem.title的情况下默认展示:Back

    • let backBarButton = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

    • navigationItem.backBarButtonItem = backBarButton

    • 去掉文字后的样式如下

      截屏2023-06-25 11.11.19.png

    • 成功去除了,但是iOS14推出了一个导航栏返回按钮长按的效果,没有去除文字时,长按弹框列表内会显示back或其他文字,当前去除文字状态,弹框内也不显示文字了,所以需要设置 backButtonDisplayMode 属性

      屏幕录制2023-06-25 11.14.35.gif

    • self.navigationItem.backButtonDisplayMode = .minimal 效果如下:

      屏幕录制2023-06-25 11.21.14.gif

  • 修改导航栏返回按钮 实现代码如下:

        //修改返回按钮图片
        self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "fanhui")
        self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "fanhui")
        //导航栏返回按钮长按处理
        let backBarButton = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        if #available(iOS 14, *) {
            self.navigationItem.backButtonDisplayMode = .minimal
        }else{
            navigationItem.backBarButtonItem = backBarButton
        }
  • 发现个问题:在我从 不继承封装基类的页面 push跳转到一个 继承自封装基类的页面 时,还是会显示back文字,因为push前的页面没有处理隐藏返回文字, 但是我封装基类的目的就是所有类都会继承自基类,就不再考虑解决这个问题了
  • 更新:现已将此部分实现代码,挪到了封装的 KWNavigationController 类中
3. 修改导航栏部分属性
  • kw_statusBarStyle = .default
  • kw_shadowHidden = true
  • 根据自身需要处理各种属性,具体使用在上一篇文章 封装导航栏NavigationController 中,请自行查看
4. 处理ViewController在屏幕中的布局扩展 【edgesForExtendedLayout】
  • .all:在导航栏和标签栏下方进行扩展
  • .top:只在导航栏下方进行扩展
  • .bottom:只在标签栏上方进行扩展
  • .left:在左边进行扩展
  • .right:在右边进行扩展
  • .none:不进行任何扩展
  • 我封装的的导航栏,有透明和渐变的效果,所以我设置的self.edgesForExtendedLayout = .top