Swift4-有妖气漫画精仿框架部分
不织布局的Swift已经更新到4.0了,对于绝大多数的iOS开发可能还停留在OC的阶段,这个已经完全落后了,但是毕竟4.0刚刚出来,网上是有不少的案例分析,版本之间的对比,但是都是比较零散的东西,很少有一套完整的项目,不适合初学者来开发学习,并且网上都比较流行的响应式变成也就是借助RXSwift等响应式框架来构造项目,但是相对的来说,这个起步就比较高了,应为响应式属于比较高级的阶段性内容,只能作为加分项,并不能作为必学项
但是很多新的开发者就会盲目的学习,甚至手上都没有写过一个完整的项目就认为已经完全掌握了Swift的基础,就已经开始了响应式的学习.这个其实就有点本末倒置了.
Swift已经更新到4.0的版本了,已经趋于稳定了,所以说实在的,需要一个近乎完整的项目来感受一下其优缺点和对比OC的不同,甚至是其他语言的不同和相同点,毕竟未来Swift肯定是趋势
所以在工作之余,抽空整理了一个比较完整的Swift4的仿写项目,Swift4出来才两个月左右,我也算是比较积极的了.
之余之前的老版本的内容就不贡献给大家了,需要修改的东西比较多,甚至还有可能跑不起来....
此篇系列也算是个基础系列,不牵扯到响应式编程等高级知识,为的是方便大家学习,能够最快的以此进入工作中去,毕竟工作环境的需求不可能完全保证你能够使用那些,但是基础的普通开发肯定是不变的
废话不啰嗦了,
之所以选择这个项目,有以下几点原因,
- 相对来说http的抓包解析更简单一点
- 相对正规的不复杂的模块架构
- 接口数据的合理(很多app的接口数据真心臃肿混乱)
- 界面的风格主题更让人愿意接受学习
既然是一个完整的项目,那么肯定需要优先搭载框架部分
如何合理的搭建框架是需要时间去规划的,并不是拿到项目的第一时间就想到什么地方就写什么地方,这样在后期由于框架的不健壮,会出现维护的难度上升的情况...
我们可以看到,项目是比较传统的4个大模块的类型
首页+分类+书架+我的
其中 首页会细分成推荐+vip+订阅+排行,但是这部分是固定的还是由服务端控制的,暂时先不研究. 总之这部分算是一个在线推荐的模块
其次,是分类模块 也算是一个在线推荐的模块 但是其会更加的细化类别
我们可以把这两个模块合并在一起,也可以按照固有样式分开,这个可以在开发的时候进行调整
当然首页和分类都会有一个搜索的入口,我们需要单独在分出一个搜索的模块
可能次模块内容比较复杂,也可能比较简单,但是单独归整成一个模块是有必要的
再次是书架模块 大致分成收藏+书单+下载 此模块相对偏向绑定用户,是一个完整的用户的离线在线的书架
最后是我们所有开发都会拥有的个人模块,没有什么可以说的
大的可以看到的大致是这样
但是经过考虑 你肯定会想到,这是一个漫画类应用,那么肯定就会有一个通用的漫画列表和漫画详情乃至最后的漫画阅读应该作为一个漫画模块
我们只有在写完整项目的时候有限构思好框架和逻辑,那样我们才能更合理的规划整个框架的构造
另外无论整个项目是使用MVC亦或者是MVVM来事项项目中的模块
首先从文件路径来划分模块,
- API用作项目的接口部分
- Model用作项目中的模型
- Component是组件部分,这部分中包含项目中遇到的自己扩展出来的共用控件,亦或者继承或者优化的第三方控件,比如刷新控件,加载控件...这部分可以视作自定义控件或者组件的模块
- Extension是用来扩展一些基础的类,比如Array....这部分将来可以用在其他项目中
- Produce是整个有妖气漫画的模块主题部分,从项目最初的入口,及各个模块的划分,另外一个Global可能会用来存储一些常量 通用的一些方法等
作为一个展示类的项目,和大多数其他APP一样,无非都是些首页,列表页,详情页,这些页面虽然独立存在,但是都会有着关联,比如使用同样的头部,大致的界面效果,乃至同样的判断逻辑等
所以我们有必要创建某些基类,无论是用作当前的开发,还是以后的扩展,都是值得的
所以你能在项目中看到这样的部分,基类的视图控制器,基类的表格cell等,这些是我们在项目开发中最常用到的控件,所以我们最好使用这些,而不是直接使用系统的原始的,这样方便我们做一些扩展
当然,作为Swift,我们也可以不使用这样的方式,Swift即使面向对象的开发模式,也是面向协议的开发模式,我们也可以创建协议,或者Extension来扩展系统原来的方法,当然,这些是后话,我们还是要从基础做起
再接下来就是整个项目的模块部分,这部分都是在需要的时候再向里面填充,
另外作为一个iOS开发,还是很推荐使用Cocoapods的,使用其来管理和维护第三方库,会更加的方便
OK,至此,整个目录框架大致解说完毕
那么框架肯定不仅仅是这么简单,
我们还需要代码层次上的框架
很显然的作为一个比较传统样式的项目,其开发模式最好的方式就是使用TabBar作为根视图,在其基础上,控制多个Navigation来管理界面层级
但是我们可以很轻易的看到,首页和书架都是一个多选页面,所以其本身应该是一个Page,来负责管理多个平级的界面
所以总的基础的tabBar的逻辑应该可以抽去出来成大概这样的
import UIKit
class UTabBarController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
tabBar.isTranslucent = false
/// 首页
let onePageVC = UHomeViewController(titles: ["推荐",
"VIP",
"订阅",
"排行"],
vcs: [UBoutiqueListViewController(),
UVIPListViewController(),
USubscibeListViewController(),
URankListViewController()],
pageStyle: .navgationBarSegment)
addChildViewController(onePageVC,
title: "首页",
image: UIImage(named: "tab_home"),
selectedImage: UIImage(named: "tab_home_S"))
/// 分类
let classVC = UCateListViewController()
addChildViewController(classVC,
title: "分类",
image: UIImage(named: "tab_class"),
selectedImage: UIImage(named: "tab_class_S"))
/// 书架
let bookVC = UBookViewController(titles: ["收藏",
"书单",
"下载"],
vcs: [UCollectListViewController(),
UDocumentListViewController(),
UDownloadListViewController()],
pageStyle: .navgationBarSegment)
addChildViewController(bookVC,
title: "书架",
image: UIImage(named: "tab_book"),
selectedImage: UIImage(named: "tab_book_S"))
/// 我的
let mineVC = UMineViewController()
addChildViewController(mineVC,
title: "我的",
image: UIImage(named: "tab_mine"),
selectedImage: UIImage(named: "tab_mine_S"))
}
func addChildViewController(_ childController: UIViewController, title:String?, image:UIImage? ,selectedImage:UIImage?) {
childController.title = title
childController.tabBarItem = UITabBarItem(title: nil,
image: image?.withRenderingMode(.alwaysOriginal),
selectedImage: selectedImage?.withRenderingMode(.alwaysOriginal))
if UIDevice.current.userInterfaceIdiom == .phone {
childController.tabBarItem.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0)
}
addChildViewController(UNavigationController(rootViewController: childController))
}
}
止于此,整个项目的基础模块框架已经搭建完毕了
欢迎访问完整项目地址: https://github.com/spicyShrimp/U17
整个项目90%精仿原版APP,适合大家学习交流