探个头,迈个脚

简单的适配从此谈起

说到适配,真是得庆幸自己做的是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: Stringvar age: Stringvar 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

【木头小开发】-iOS小小里程总结一二相关推荐

  1. iospython开发工具_使用Python开发iOS程序

    们见过使用JS.Lua.Ruby开发iOS程序的,但是基本没有见过使用Python开发iOS程序(软件)的,这是为什么?关于这个问题,我后面会回答. 那么,怎么用Python开发iOS程序呢?其实我们 ...

  2. ios 上传图片失败 小程序_微信小程序ios端 使用ajaxSubmit上传图片失败,android没问题...

    微信小程序ios端 使用ajaxSubmit上传图片失败,android没问题 微信小程序开发上传图片,使用ajaxsubmit,post请求,form设置multipart/form-data, a ...

  3. iOS开发- ios学习资源(持续更新)

    mark一些自己在学习过程中收集的资源.免得需要的时候没地方找. 持续更新.(最新更新时间: 2014.4.4) 1.苹果官方文档 构建iOS程序:下面的这篇文章介绍了 iOS 程序开发的过程: St ...

  4. Windows上使用ionic开发IOS程序

    开发ios程序需要mac本,但是好多屌丝们没有Mac 本,那就在虚拟机上安装一个MacOS,凑合着用吧. 下面我就以我自己的亲身经历,带着ionic爱好者一步一步的在windows上开发ios程序 安 ...

  5. 使用HTML(Web)开发iOS/iPhone/iPad应用

    许多人想开发自己的iOS App吧?iOS App有几种开发的方法.一种是"正规"的方法,就是Xcode+ObjC.但是这样既得学习ObjC语言,又得搭建Xcode开发环境.都弄完 ...

  6. 1、swift开发iOS——基础

    swift开发iphone app SWIFT Swift 是一种支持多编程范式和编译式的开源编程语言,苹果于2014年WWDC(苹果开发者大会)发布,用于开发 iOS,OS X 和 watchOS ...

  7. 直播网站源码直播平台软件开发iOS动手做一个直播(原理篇)

    直播网站源码直播平台软件开发iOS动手做一个直播(原理篇) 上篇文章主要给出了代码,但是并没有详细说明直播相关的知识,这篇文章就说一下直播的相关理论知识.附上直播代码篇地址. ###推流 腾讯直播平台 ...

  8. python可以在ios上运行吗_python可以开发ios吗

    对,你没有看错,就是使用Python开发iOS程序! 我们见过使用JS.Lua.Ruby开发iOS程序的,但是基本没有见过使用Python开发iOS程序(软件)的,这是为什么?关于这个问题,我后面会回 ...

  9. 在Flutter项目中开发IOS桌面组件(WidgetExtension)

    在Flutter项目中开发IOS桌面组件(WidgetExtension) 具体的WidgetExtension的开发流程这里就不细说了,可以参考文末的链接. 在Flutter项目开发IOSWidge ...

最新文章

  1. 斯特芬森迭代法(Python)
  2. BayaiM__oracle切换归档模式步骤:
  3. SQL语句查询条数不足10行时如何自动补充空行
  4. php aes java_AES php java 互转
  5. You must install signalwire-client-c to build mod_signalwire
  6. python编写端口扫描器_端口扫描器编写 python
  7. AlphaZero问世:8小时完爆围棋、国际象棋、日本将棋(转)
  8. Intel SGX入门
  9. InvalidArgumentError (see above for traceback): Number of ways to split should evenly divide the spl
  10. signature=530d9c5e7e99d796faa35352560aede4,Visual Detection of Volcanic Plumes
  11. godaddy生成https 域名证书
  12. 组卷与考试系统_题库添加选择题模块
  13. windows10 20H2版本微软账户登录不上解决方法
  14. [转载]JS和AS交互 作者:ludanlove
  15. 可视化大屏幕的适配方法-vw/vh
  16. Hashtable用法
  17. office2016 使用KMS破解无法连接服务器
  18. kali linux 命令
  19. Verilog实现按键计数器
  20. POJ 3107 Godfather(树形DP(找重心))

热门文章

  1. 过滤:filter、结果收集(数组)
  2. Java并发编程—自旋锁CLHLock原理
  3. TCP协议可靠性保证(确认应答机制,超时重传机制,流量控制,拥塞窗口)
  4. 拍拍贷信贷申请审核竞赛模拟
  5. sublime linux下无法输入中文
  6. (64位oracle使用32位的PLSQL)安装64位的oracle数据库软件,使用32位的PLSQL Developer连接方法...
  7. 在Axapta中实现trim函数
  8. tomcat错误:The page you tried to access (/manager/login.do) does not exist
  9. CentOS 7下搭建配置 SVN 服务器
  10. 矩阵儿快速幂 - POJ 3233 矩阵力量系列