探个头,迈个脚
简单的适配从此谈起
说到适配,真是得庆幸自己做的是iOS而不是Android,Android不说机型,光是厂家就“千千万”。回到iOS,我入门算晚,iPhone已经出到XR系列,除了正常的机型Size要考虑,还多了刘海需要适配。
要让UI在不同的Size上显示“一致”,那究竟该怎么做?那么就得从头说起,我们的UI到底怎么写出来?
纯代码写UI
众所周知,可以纯代码写UI,这样在写UI的时候,可以在设置 x 、y 、 width 、 height
时:
- 设置固定宽高,以保证view大小不根据机型而改变。
- 宽高设置成比例,比如:screen的几分之几等。以达到在不同机型下,view都是适应其比例。
- 设置固定坐标,以保证view所显示的位置不根据机型而改变(只是要考虑到,可能会离屏)。
- 坐标设置成依赖型,即根据另一个view的位置计算坐标值。以达到在不同机型下,大小的改变之后仍然能保持相当的位置关系。
在纯代码的写UI时,目前所理解,便是以上四条互相应用。另外可以考虑使用第三库SnapKit,可以更容易的去写控件。
Storyboard写UI
苹果自啥时候来的,就有了xib、Storyboard,可以以此来进行UI的实现。回想我刚开始学习iOS开发的时候,写Ui选择的先是纯代码写,后来…就是Storyboard一起用,毕竟拖拽➕约束是真的方便。
Storyboard搭建UI时基本就是以下流程:
- 拖拽控件,布局界面。
- 添加约束,保证没有红色为止。
- 如果需要,添加对应的ID。
- 与
.swift
文件关联。 - Done
添加约束小trick:Pinning & Alignment,前者是上下左右添加“限制”(x\y\width\height设置),后者是一种相对关系(与谁对齐,与谁居中等)。StackView,个人用的比较少,貌似在用的时候带着点“均分”的理念去考虑怎么布局会好点。
UI,边边角角?
- 我们用到的资源文件(图,icon),一般会带有
x,2x,3x
,只要命名规范,会根据机型自行选择合适的资源。 - Point与像素不一样。(好像是个两倍的关系???)
- UI是可以“热调试”,好像是个插件还是第三方库来着,可以使UI调试的时候不需要每次都跑一遍。
- 说到调试,Xcode9开始吧,可以无线调试。
Hello World
世界之基——Swift
落实到开发,语法始终是逃不过的一关。事实上,但凡有开发经验的人,简单的上手新语言应该都不会太难。
- 变量、常量
- 函数、类
- 循环、判断语句
也就是说有张Swift的Cheat Sheet,基本就可以上手进行开发是不成问题。只是说,随着开发时间的增长,会逐渐认识到,基础的语法可能不能满足需求了。
- optional = ?
- do try catch
- Delegate
- Protocol
- closure
- get set
- enum
- struct
- ……
渐渐的,开始真正去补充了解Swfit语言的特性,也许还不够深入,但是会比之前好很多。比如:
- 定义Model的时候,会知道也可以用Struct。
- 定义一些常量的时候,可以考虑是否用枚举或静态常量等。
- 代码Clean的时候,可以考虑用extension来整理。
- 属性定义的时候,会想到有没有必要用计算属性,还是懒加载。
- 为了防止程序crash,是不是用do try 会好一点。
- 为了减少循环的嵌套层级太多,是否可以用guard来提前跳出。
- 闭包的使用,协议的实现等等……
一门语言,除了化用其他语言的语法经验,肯定是有很多属于它自己的特性有待了解。一开始,其实也有看过,可是,就像我写的这些字多少还是有点空洞,看多了,就懵,甚至都记不得多少。后来,接触的多了,认识到自己的不足越来越多,去了解了,自然也就逐渐加深了理解与应用。
世界之构建——设计模式
关于设计模式,有人跟我说过,“不用看,写的多了,自然就懂了。”
事实上,写的多了,不见得就真的懂了。但是,会越发的觉得自己的代码实在是丑陋。这种丑陋一般表现在:
- 冗余,冗余,还是冗余
- 命名不清晰
- 排版糟糕
- 注释不明
- 维护艰难
- 扩展也艰难
- ……
接下来,自己就开始尽量去避免上述问题,但是自行摸索的道路也是不断碰壁,到现在也没见的就能定下一个属于自己的规范。话说回来,这些和设计模式有啥么子关系呢?因为,在我看来,代码在基础上都做不到优雅,还何谈设计模式。设计模式,应该算是”理念先行“吧。毕竟语法还是那个语法,这设计模式和那设计模式,最大的不同,或者说代码的组织不同,主要是理念的问题吧。(大神看到,请原谅我这粗浅的理解)
而我,对设计模式曾今几次去学习(看大神的博客),可是看的越多就越糊涂。总觉得,不就是建个文件夹,然后就是”随方制象,各有所宜“(该干嘛做成干嘛的,该放哪就放哪)。
就 MVC 试着说一二
MVC在iOS开发里应该是耳熟能详的了,白胡子老爷爷开课必讲,网上相关的资料也是不少。我就说说我粗浅的理解以及应用。
Model
M,即Model,一般来说,我们的App都会有需要用的数据,多数都是网络请求,JSON解析得来。那就接着JSON解析来说,我们不大会就直接在用数据的时候,就把JSON给”变出来“用。要知道,可能只是用一个值,这时候去请求解析JSON,或者从缓存的JSON中取值,都特别麻烦。就像这一段话,啰嗦的很……
所以,我们一般会选择定义一个模型结构……还是上代码吧。
Struct User { var name: String var age: String var sex: String var isSelected: Bool}复制代码
定义了如上的Model之后,直接用Model存数据,就会方便很多,还能方便取用。找某人的年龄时,直接:某某.age 即可。
另外,一般在使用过程中,为了解耦(是这么说的吧)。还有一个ActionModel(我是这么理解的…行为模型),比如改变用户选中状态,这么一个行为,也是归在一个类中去实现。当数据更改之后,再在VC中刷新数据对应的View。
View
接下来,再想想,一个App,什么不能没有???
那肯定就是View!可以没有模型,可是如果没有View,这个App就不存在。View,我的理解就是UI,一般我们使用sb、xib或者代码手写完成。前者,直接拖拽,并设置好一些属性,有需要根据数据或者状态而改变的View,则关联到代码中。至于后者,可以选择新建一个.swift来实现这个View,以Tableview为典型。如果把这部分写在ViewController中,会造成代码特别多,当本身VC中逻辑代码就多的时候会不利于维护。所以可以算作是自定义一个TableView,并实现相关的协议,只是要考虑到传值和跳转的问题,可以考虑定义这个TableView的DelegateT
如此一来,View也就被抽离出来,方便了本身的实现,也方便后期的维护和一些View的复用等。
ViewController
最后,自然就是到了ViewController,之所以有这么多设计模式出来,可以大胆的说就是为了让VC更精简也不为过吧。其实,网络请求,数据模型,View的实现都是可以放在VC中。可是,最后造成的就是一个.swift文件,可能就有数不胜数的代码。
如上,当进行维护和开发的时候,实在是一个巨大的消耗。所以,把Model,View抽离出去,VC里面主要就是做各种申明(变量、Model、View等)和逻辑(业务)处理。
其他
其他,还会有像网络请求,现在的我会选择放在一处进行处理,包括对Data的缓存。
一些Helper类,也会抽离出来,方便调用和维护。还有配置相关的内容也会集中处理。大致如此吧……
世界之角
你有权限吗?
有句话咋说来着——在其位谋其政。额,好像不太适合引用。总之就是,你想做点啥,你得先拥有相关的权限。
想要获取GPS定位,相机拍照,网络请求等等,都得先去设置相关的权限许可。此处就要找到Info.plist文件。在这个文件里,除了可以设置权限,还能设置状态栏的Style,可以设置App的名字等。
OC 和 Swift 有没有可能
多年前,大家都用OC做开发语言,现在还是蛮多大厂用着OC。不过,谁都知道Swift是趋势,是未来。那它们之间可有某种连接呢?有的!!!
通过桥接文件,可以让你在Swift中使用OC的代码(库),反之亦可(我没用过罢了)。至于桥接文件怎么搞出来,别那么随便的搜,一搜就有。
世界那么大,没有我你啥也看不到——cocoapods
cocoapods是一个第三方库管理工具,事实上Swift有一个最新的叫Carthage,它更为轻巧灵活,使用也简单。不过,目前为止,我还是用cocoapods,相信用cocoapods的开发者也是比较多的。人嘛,总归是习惯了,就不想换了。爱一个人,应该也是这样吧。
既然能看了,那都能看点啥?
- 网络请求
- Alamofire
- Moya
- Kingfisher
- JSON解析
- SwiftyJSON
- 加密
- CryptoSwift
- 存储
- KeychainAccess
- 小菊花
- SVProgressHUD
- PKHUD
- 数据库
- Realm
- 颜色
- ChameleonFramework
- ……还有很多用过的,没用过的,以后看到就整理过来
世界的进程,历历在目——Git
一个项目也好,一个文档也好,其实都可以版本化管理。这就不得不说Git了,版本控制的好工具。很早以前还会用命令行使用Git,现在已经依赖于它的桌面程序了……用Git管理项目,实在是好过每次更新了内容就压缩一个文件夹……
未来
ML
ML、DL、AI各种大热,在iOS上它们也早已活跃,除了广为诟病的Siri为代表,现在升级到最新系统的相册也是典型代表之一,可以智能匹配类别,推荐等。
Apple为我们提供了Core ML,Create ML,还为我们提供了一些现成的模型供下载使用,可以进行物体识别的尝试。用起来真的很简单,下载模型,导入到项目中。然后根据示例代码(没几行)就能用上高大上的机器学习。
关于ML的应用,难的应该得数模型怎么训练出来,没想到Create ML 结合 Playground训练标签分类的模型真的是很方便。用猫狗识别做过例子,收集好数据,按文件夹存储,Playground里面两行代码,然后拖文件夹就可以训练了,Test也是一样,训练效果还不错。值得一说的是,训练的图片都不需要自己切割成大小一样的。
AR
ARKit2出来之后,好像能力更强了,还看到有人写了一个App,通过眼镜的移动可以控制App的点击事件。看了下AR简单的入门教程,可能因为是入门的原因吧,真的比较简单。Tracking目标,然后加载模型。就能简单的实现在宠物小精灵卡上渲染出对应的小精灵模型。另外,现在还有很多3D模型可以转苹果的USDZ格式,这样模型来源也较多了。
当然,我只是简单的跑个模型看看,要实现酷炫的交互少不了麻烦的要算的东西。只是,现在没有具体的学习目标,所以还没有看的太多。
后记:工作一年有余,基本就是自己瞎摸索乱学习过来的,特别是近期工作上重构了项目代码,更是感觉进步是有的,但是不足和有待学习的还有好多好多……以上,以及还有好多没有写出来的,谨纪念我这一年有余的学习工作吧。