先放demo地址:github.com/KeWangKW/99…
- 理论上swift和OC不能相互继承,但可通过 侨接文件 或者 NSObject 侨接实现
- 实现起来确实挺恶心的,所以还是封装两套吧
- swift-----KSViewController
- OC-----KOViewController
- 从此,项目内所有创建的ViewController 都将继承自 KSViewController 或 KOViewController
基类中做的处理:
1. 在 swift中 deinit 【等同于OC的 delloc】方法中,控制台打印了当前类名,作为退出当前页面的一个提示
2. 修改导航栏返回按钮
-
可直接自定义 backBarButtonItem 替换实现,我以下的实现方式是修改系统样式实现
-
原系统样式为:
-
修改返回按钮的图片:
- self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "fanhui")
- self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "fanhui")
- 需同时设置backIndicatorImage 和 backIndicatorTransitionMaskImage,backIndicatorImage是默认展示,而backIndicatorTransitionMaskImage是选中状态下的展示,同时设置可以确保返回按钮在所有情况下都应用你指定的图像
-
修改图片后样式如下:
-
去掉返回按钮后面的文字 ,未设置navigationItem.title的情况下默认展示:Back
-
let backBarButton = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
-
navigationItem.backBarButtonItem = backBarButton
-
去掉文字后的样式如下
-
成功去除了,但是iOS14推出了一个导航栏返回按钮长按的效果,没有去除文字时,长按弹框列表内会显示back或其他文字,当前去除文字状态,弹框内也不显示文字了,所以需要设置 backButtonDisplayMode 属性
-
self.navigationItem.backButtonDisplayMode = .minimal 效果如下:
-
-
修改导航栏返回按钮 实现代码如下:
//修改返回按钮图片
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