博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【木头小开发】-iOS小小里程总结一二
阅读量:6489 次
发布时间:2019-06-24

本文共 4707 字,大约阅读时间需要 15 分钟。

探个头,迈个脚

简单的适配从此谈起

说到适配,真是得庆幸自己做的是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格式,这样模型来源也较多了。

当然,我只是简单的跑个模型看看,要实现酷炫的交互少不了麻烦的要算的东西。只是,现在没有具体的学习目标,所以还没有看的太多。


后记:工作一年有余,基本就是自己瞎摸索乱学习过来的,特别是近期工作上重构了项目代码,更是感觉进步是有的,但是不足和有待学习的还有好多好多……以上,以及还有好多没有写出来的,谨纪念我这一年有余的学习工作吧。

转载于:https://juejin.im/post/5bd2e2b85188252928653645

你可能感兴趣的文章
ES6中Set集合(与java里类似)
查看>>
Python的全局和局部变量
查看>>
快递企业如何完成运单订阅消息的推送
查看>>
shell特殊符号cut命令 sort_wc_uniq命令 tee_tr_split命令 shell特殊符号
查看>>
使用vcastr22.swf做flash版网页视频播放器
查看>>
currentThread()方法返回代码段正在被哪个线程调用
查看>>
java 执行command
查看>>
修改远程桌面连接端口3389,RDP-Tcp的portnumber要用十六进制修改
查看>>
8-Highcharts曲线图之对数直线图
查看>>
Leetcode: Shuffle an Array
查看>>
JSP 页面传值方法总结
查看>>
再探canvas(小球实例)
查看>>
(原)torch中提示Unwritable object <userdata> at <?>.callback.self.XXX.threads.__gc__
查看>>
现在就可以使用的5个 ES6 特性
查看>>
端午遥想
查看>>
根据无向图的边邻接矩阵求任意一点到其他所有点之间的最短路径。
查看>>
leetcode - Search Insert Position
查看>>
chorme 关于flash的问题
查看>>
XMPP基本内容简单介绍
查看>>
NYOJ 38 布线问题_(解法1 Kruskal算法)
查看>>