【木头小开发】-iOS小小里程总结一二
探个头,迈个脚
简单的适配从此谈起
说到适配,真是得庆幸自己做的是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小小里程总结一二相关推荐
- iospython开发工具_使用Python开发iOS程序
们见过使用JS.Lua.Ruby开发iOS程序的,但是基本没有见过使用Python开发iOS程序(软件)的,这是为什么?关于这个问题,我后面会回答. 那么,怎么用Python开发iOS程序呢?其实我们 ...
- ios 上传图片失败 小程序_微信小程序ios端 使用ajaxSubmit上传图片失败,android没问题...
微信小程序ios端 使用ajaxSubmit上传图片失败,android没问题 微信小程序开发上传图片,使用ajaxsubmit,post请求,form设置multipart/form-data, a ...
- iOS开发- ios学习资源(持续更新)
mark一些自己在学习过程中收集的资源.免得需要的时候没地方找. 持续更新.(最新更新时间: 2014.4.4) 1.苹果官方文档 构建iOS程序:下面的这篇文章介绍了 iOS 程序开发的过程: St ...
- Windows上使用ionic开发IOS程序
开发ios程序需要mac本,但是好多屌丝们没有Mac 本,那就在虚拟机上安装一个MacOS,凑合着用吧. 下面我就以我自己的亲身经历,带着ionic爱好者一步一步的在windows上开发ios程序 安 ...
- 使用HTML(Web)开发iOS/iPhone/iPad应用
许多人想开发自己的iOS App吧?iOS App有几种开发的方法.一种是"正规"的方法,就是Xcode+ObjC.但是这样既得学习ObjC语言,又得搭建Xcode开发环境.都弄完 ...
- 1、swift开发iOS——基础
swift开发iphone app SWIFT Swift 是一种支持多编程范式和编译式的开源编程语言,苹果于2014年WWDC(苹果开发者大会)发布,用于开发 iOS,OS X 和 watchOS ...
- 直播网站源码直播平台软件开发iOS动手做一个直播(原理篇)
直播网站源码直播平台软件开发iOS动手做一个直播(原理篇) 上篇文章主要给出了代码,但是并没有详细说明直播相关的知识,这篇文章就说一下直播的相关理论知识.附上直播代码篇地址. ###推流 腾讯直播平台 ...
- python可以在ios上运行吗_python可以开发ios吗
对,你没有看错,就是使用Python开发iOS程序! 我们见过使用JS.Lua.Ruby开发iOS程序的,但是基本没有见过使用Python开发iOS程序(软件)的,这是为什么?关于这个问题,我后面会回 ...
- 在Flutter项目中开发IOS桌面组件(WidgetExtension)
在Flutter项目中开发IOS桌面组件(WidgetExtension) 具体的WidgetExtension的开发流程这里就不细说了,可以参考文末的链接. 在Flutter项目开发IOSWidge ...
最新文章
- 斯特芬森迭代法(Python)
- BayaiM__oracle切换归档模式步骤:
- SQL语句查询条数不足10行时如何自动补充空行
- php aes java_AES php java 互转
- You must install signalwire-client-c to build mod_signalwire
- python编写端口扫描器_端口扫描器编写 python
- AlphaZero问世:8小时完爆围棋、国际象棋、日本将棋(转)
- Intel SGX入门
- InvalidArgumentError (see above for traceback): Number of ways to split should evenly divide the spl
- signature=530d9c5e7e99d796faa35352560aede4,Visual Detection of Volcanic Plumes
- godaddy生成https 域名证书
- 组卷与考试系统_题库添加选择题模块
- windows10 20H2版本微软账户登录不上解决方法
- [转载]JS和AS交互 作者:ludanlove
- 可视化大屏幕的适配方法-vw/vh
- Hashtable用法
- office2016 使用KMS破解无法连接服务器
- kali linux 命令
- Verilog实现按键计数器
- POJ 3107 Godfather(树形DP(找重心))
热门文章
- 过滤:filter、结果收集(数组)
- Java并发编程—自旋锁CLHLock原理
- TCP协议可靠性保证(确认应答机制,超时重传机制,流量控制,拥塞窗口)
- 拍拍贷信贷申请审核竞赛模拟
- sublime linux下无法输入中文
- (64位oracle使用32位的PLSQL)安装64位的oracle数据库软件,使用32位的PLSQL Developer连接方法...
- 在Axapta中实现trim函数
- tomcat错误:The page you tried to access (/manager/login.do) does not exist
- CentOS 7下搭建配置 SVN 服务器
- 矩阵儿快速幂 - POJ 3233 矩阵力量系列