1. 从自己实现isa-swizzling到说一些Runtime的内容

    请叫我背景大人 前段时间写了一篇isa-swizzling?什么鬼?的文章,就想说稍微实现一下isa-swizzling。然而其实实现起来非常简单,但是其中的一些Runtime内容以及一些其他的知识还是值得一讲的。 好吧,我承认我本来是想写自己实现KVO,然后我发现太长了,想说先从isa-swizzling开始。然而这并不妨碍我可能还会更一篇来说一些手动实现KVO,但是谁知道呢。如果还完全不了解isa-swizzling干了什么的同学(路人甲:谁是什么~,路人乙:你好污,巫妖王),isa-swizzling?什么鬼?不多说,自己看。 关门放狗,不对,是代码 static void DefaultSetterForKVO(id self, SEL _cmd, void *value) { NSString *setterName = NSStringFromSelector(_cmd); NSString *key = [self obtainGetterFromSetter:setterName]; [self willChangeValueForKey:key]; Class subCls = object_…


  2. iOS适配之旅——Autolayout时代

    开篇 其实对于Autolayout的资料非常非常的多,博主也是略自皮毛,也上不了大雅之堂。这里只是给大家稍微整理一下,可定也不是很全面,主要是针对AutoLayout给这个系列进行稍微的讲解一下。其实呢,对于很多人来说Autolayout都懂的非常多,我呢,其实也不是很想写,我也是被人架着刀放在脖子上去写的。既然大家不想听,那这篇就到此为止吧。(特么的,你是来骗我们进来的么,要么讲要么退票钱😡)好吧,既然大家都想稍微听听,那就听老娘,咳咳咳,不好意思,听本少爷慢慢说来。 引言 其实相对于Autoresizing来说,Autolayout是另一个质的飞跃。他能适配的情况更多。而对于Autolayout来说他是一个非常强大的工具,即使对于之后的Size Class来说其中核心用的还是Autolayout,那么就有人会问了,AutoLayout到底是什么呢,或者说是他是怎么实现的呢。其实Autolayout都是基于一种叫做约束(NSLayoutConstraint)的东西。其实很多iOS程序员应该都懂。至于是关于NSLayoutConstraints入门我就不说了。这里我就开始说一些我想说的东西吧。 好了接下来我主要分三个方面来给大家讲述如何添加约束。当然,下面的知识最好是建立在对NSLayoutConstraint有一定了解的情况下来看,毕竟我是一个非常傲娇的啦。 代码添加 首先其实对于Autolayout来说添加的方式有两种,分别是xib和代码添加。 而对于xib上的添加小伙伴应该会比较熟悉一点,那么我们就从代码添加开始吧。众所周知,所谓的Autolayout时间里在一些列的NSLayoutConstraint的实例上进行确定每个控件的大小以及位置的。…

    on Layout AutoLayout iOS

  3. iOS适配之旅——穿越时空的爱恋(手动适配和Autoresizing)

    其实很多人看到这个标题的时候会觉得有点陈词滥调了,毕竟关于适配的文章在网络上真的是多的多如牛毛,你这里有什么好看。其实我也不知道为什么要写这个文章。 写在最前面 前段时间公司在招iOS的人员,我去稍微搀和了一下,也面试了一些iOS的技术人员,有那么一句感慨就是:“紫薇,别离开我”,不对,是好像很多人在iOS上做了好多年,可是技术方面还是停留在几年前。别的都好说,关键对于适配方面好多人都是停留在某一个阶段或者某两个阶段上,更有甚至的就是完全不知道新的东西或者是完全是在根据屏幕大小进行按照比例缩放(全代码形式)。所以我就想说是不是要整理一下,关于iOS适配的发展稍微进行系统的讲解一下。至少大家对各个方面都稍微有点理解,当大家遇到旧的项目或者是遇到某一个适配情形下的代码或者界面可以有稍微理解。并且稍微整理一下一些在iOS 9里面的新特性,方面大家从整体方面来看适配的大体框架以及一些细节的新特征。 当然首先先说一下目前来说主流方面来说主要是经历一下几个阶段: 手动适配 Autoresizing AutoLayout Size Class 当然,在今年要出来的WWDC大会上希望能出现更好的特性来帮助我们开发者缩短或者是简化我们的适配流程。当然这篇稍微讲解一下手动适配和Autoresizing,当然这篇文章的也是博主自己的经验所述,如果有什么有问题的地方,麻烦大家指出,本人必定虚心改正,痛改前非。 穿越时空的爱恋(手动适配) 看到这个题目大家有没有想到张庭当初演的那部电视剧,大家有没有想到当初那部剧的男主是谁,没错就是徐峥!!!!当初怎么也算的上是小鲜肉吧,我完全没有反应过来那个人是徐峥。那现在让我们将时间穿越到明朝,不对不对,是2011年。 背景:…

    on Layout iOS

  4. Cocoapods系列教程(三)——私有库管理和模块化管理

    写在前面 年前到现在大部分时间都在整理和抽象之前项目的代码,那酸爽,真是够够的。主要是公司产品是做定制版的本需求,而前期对定制的内容需求太不明确了,导致领导先说前期就用不同代码管理不同的定制版。最后我们这里中英文版就有6套代码,导致管理起来特别不方便。而之前在写代码的时候完整体的框架是写好的,可是在细节上的封装来说就差太远了。导致整个代码的耦合度太高了,这段时间抽象起来相当痛苦。所以现在就开始对项目进行模块化管理,保证各个模块之前可以重用和替换,并且之后根据客户需求只加载用户需求的模块。 最后我决定采用Cocoapods对各个模块进行管理,采用公有库和私有库共存的状态。然后在添加配置文件以及一些Runtime的机制进行管理。 而对于一个公司的核心代码来说,当然不可能采用公开的形似来进行管理对已的框架。所以在Cocoapods中,还有另一种方式提供给公司内部管理进行管理代码,那就是私有库(Private Pods)。 私有库 好了,废话不多说了,我们先开始说说如何创建私有库吧。其实创建私有库的核心过程还是跟公有库是差不多的。不管是私有库还是公有库,关注点都在于Podspec文件的书写。但是在上篇文章中讲过了大体Podspec文件以及创建公有库的流程了,这里我就对那些部分不进行详细讲解了。这里针对一些不同的地方以及需要注意的地方进行讲解一下。 首先在创建私有库之前,我们是不是该先创建一个私有库该往哪个仓库提交的仓库(Spec)。 所以当然当务之急是先创建一个私有仓库啦。而这个仓库对于公司来说的话,最好是搭建在内网里面,用Gitlab之类的git仓库管理工具即可。 这里再带一句,其实我们上章所讲到pod trunk push 项目名.podspec这条命令,其实是默认我们的Podspec文件提交到Cocoapod的仓库(…

    on Cocoapods

  5. Cocoapods系列教程(二)——开源主义接班人

    引言 在写该博客的时候,博主刚看到一个问题:“那些头衔只是看起来很厉害,实际不难获得?”。然后有个神回复写到:“共产主义接班人”。然后脑袋里面就响起那首斗志昂扬的歌:“我们都是共产主义接班人.....!@#$%^&*()”。借此就来引入今天的博文,作为现在开源横行的年代。作为一位刚毕业的iOS小学生,开源主义接班人,我们怎么能不撸起代码来呢?特别是针对那些自己做的很溜的控件啊,插件啊之类的。作为开发者总有一中冲动想向全世界呐喊这个是我写的。当然,如果作为一个控件,框架或者是第三方的开源,想要给别人用,却又能做到版本管理,当然就少不了我们上节说到的Cocoapods啦。 “还有Carthage!”角落里默默传来了一个声音。是谁!是谁在拆我的台。好吧,开玩笑。 上节已经讲了Cocoapods作为使用者的基本用法,如果小伙伴没有看过的话,博主强烈建议大家去瞅一瞅。这节我们针对贡献者再进行细致的讲一讲。 “开源”代码 说到“开源”代码很多人脑袋里面第一个想到的就是完全开源给全世界的人。但是这篇文章需要产生另一个分解,针对开源的对象进行分解。对于公开给所有的人的开源我们称之为公有库。而除了我们平常所说的开源外,还有一种形式是公司内部的开源,即对部分开源,通常情况下我们针对这个库有称之为私有库。但是怎么说也是对少部分人开源了对吧。而本章中就针对这两部分人群进行讲解,分别公有库和私有库在Cocoapods上的使用进行讲解一下。 当然,…

    on Cocoapods

  6. Cocoapods系列教程(一)——入门

    开场 对于这个东西估计绝大多数的童鞋应该都不陌生了,不过这里还是稍微对大家唠唠嗑,可能对于那些没用过的童鞋也有可能是一种帮助呢,我们要一视同仁对吧。 对于Cocoapods是个什么东西估计大家多少听过了,可能有些童鞋没有用过,但是多少也听过了。如果没听过的童鞋就听我唠一句嗑: Cocoapods是一个框架依赖管理的一个管理工具,主要是用来管理框架一些开源库在项目中的引用。简而言之就是用来管理你的项目中对开源框架或自己公司子模块的依赖。 当然作为使用者来说,入门教程简单的要死。但是作为一个开发人员不能只满足于当前的步伐,而应该不断进取,要做到能想Cocoapods提交项目,并且在自己项目中熟练应用该工具的程度。特别是如果一个大的公司来说的话,就有可能进行模块化开发了。对于国内很多公司还是在用OC来说的话,Cocoapods应该还是一个不错的模块管理的工具。 当然第一篇文章来点简单的,主要是正对使用者来进行讲解的。 安装 当然,刚开始说这说那也没什么卵用,不如直接开始。要使用这个工具,首先当然应该是安装这个工具啦。其实安装这个就一句话的事情: $ sudo gem install cocoapods 但是在Mac OS X EL Capitan(10.11)中就会出现Operation not permitted - /usr/bin/pod的错误,当我遇到这个错误的时候我整个人是拒绝的,…

    on Cocoapods

  7. Health Kit教程(二)

    引言 继续Health Kit的教程,上篇文章Health Kit教程(一)中介绍了关于Health Kit的基础用法。而这篇文章的基础就是建立在上篇文章的基础上,如果对于Health Kit的基础还不是很熟悉的童鞋可以阅读上篇文章来学一些基础的Health Kit的基础用法,然后再来看这篇文章。这篇文章主要是针对在一次运动中的一系列数据进行处理的方法。我们都知道,在一次运动中不可能只是一个数据的变化,有可能有多个数据的变化。就用跑步来说,跑步过程中除了心率变化外,还有一些列的其他数据变化如距离、卡路里消耗等等。所以对于一次运动过程中则需要对于多个数据进行处理。 本片文章是在Xcode 7.1 / Swift 2.0的基础上进行开发的。 处理运动 保存体能训练 在一次运动中,我们需要对多种数据进行处理,而如果为每个数据都单独进行处理的话,没办法看出各个数据之间的关系。而Health Kit针对这点则提出了一个概念为Workout(体能训练),即可以将多种数据的变化添加到一个Workout进行处理。就好像是一个购物清单一样,里面包含着各种数据指标的变化。同理,一个体能训练可以管理多种数据。 这里我们就举一个最简单的运动类型----跑步,这篇文章就针对跑步进行讲解。假设在跑步过程中我们只考虑一下几个指标:距离、消耗时间以及消耗的卡路里。 那么开始上代码吧,先再工具类中添加一个方法用于保存体能训练的数据: class…

    on Health Kit Swift

  8. Health Kit教程(一)

    引言 Health Kit是在iOS8中才出现的一个新的特性,是用来提供存储和获取用户健康数据的一个苹果自带的数据中心。而本篇文章的核心就是提供一个Health Kit的教程性知识。而对于Health Kit的教程将用两篇文章的篇幅进行讲解。通过这两篇文章,小伙伴们将会学到关于Health Kit的一些基础使用。 而本片文章是在Xcode 7.1 / Swift 2.0的基础上进行开发的。 准备好开始Health Kit之旅了吗?那么开始吧! 开始 那么在开始之前,首先对本片文章所要叙述的内容进行大体介绍一下。本篇文章主要讲解一下几个知识点: * 获取Health Kit 的授权 * 读取用户属性 * 读取或写入用户特性 鉴于编程的学习都是需要建立在编码的基础上,那么小伙伴都新建好新的Health Kit的项目了吗?如果准备好的话,那我们就继续往下走吧。 获取Health Kit的授权 授权之配置篇 在开始编程之前,我们肯定要对项目中关于获得Health Kit的授权进行一些基础的配置,保证我们之后在写代码过程中畅通无阻。 那么首先先填好Bundle Identifier以及选择好对应的Team,具体如下图 在这需要到target的General中填写好对应的渠道名以及选好对应的开发者 然后就是就是添加对应授权文件(即entitlement文件),其实不需要我们手动去添加,只需Capabilities中打开HealtKit的开关为On即可,然后稍等片刻后即可。…

    on Health Kit

  9. 遭遇Crash文件战----教你如何搞定iOS崩溃日志

    请叫我背景 最近在提交应用到App Store的时候,竟然被拒了两次。那时候心里的想法是,尼玛完蛋了,要被老板开除了,我是不是要失业了。于是乎那两周几乎毛脑子都是为什么Apple你这么狠心,我们明明相爱了那么多年,你竟然就这样抛弃了我。我不想活了,不要拦着我,我要分分钟切腹给你看。然后内心的纠结并没有什么卵用。而关于第一次被拒我这里就不说了,正对第二次被拒稍微进行拓展。 崩溃被拒 第二次被拒这是因为一个崩溃而被拒的。在我刚看到崩溃的时候就想着,小case,崩溃的bug还是比较好解决的,至少好定位,相对第一次那种没有说明具体原因被拒好查多了。关键是Apple的审核人员还提供了crash的文件给我。在我洋洋得意的下载并且打开苹果方面放给我的崩溃日志的时候,尼玛我又蒙逼了,里面完全没有我熟悉的代码以及行数的显示什么的,跟我所熟知的类型(见下图)完全不一样啊,熟悉的配方,熟悉的味道明明在后面是有大概的错误方法调用的堆栈信息的说。 特么苹果给我的是一对内存地址的样式(见下图)啊!!!!!!!特么只有一对地址的位置信息,特么你告诉我这怎么看,这怎么看,你过来看我打不打死你! 然后我特么自己想重新苹果审核人员重现的Bug特么一直就是重现不了,没办法最后只能去找找看下有没有办法反编译这种加密的崩溃日志。然后我在研究官方文档的时候我看到了一句话叫做: Symbolication - resolving backtrace addresses to source…


  10. iOS-Echarts------定制性高的图表控件

    我是前言 最近遇到一个非常严于自律的UI,那酸爽-------几个像素都要求的非常以及相当的严格。为此本王差点都跟她打起来了(开玩笑的,我这么绅士怎么可能打女生呢)。而在App中需要显示数据趋势什么的,那UI对界面要求,线条粗细,字体,字体大小,颜色,透明度各种各种。那时候我内心是崩溃的! 以我对她的了解来说如果她不满意随时都可能对图表进行改动她所谓的小改动。于是我开始踏山涉水,走亲访友寻觅着我的梦中图表。可是走了一全我感觉定制性都不够啊。 没办法,最后找来找去可能只能通过H5的画出来的图表效果什么的可能会好一点。最后将目光锁定在百度的Echarts的控件上来。 Echarts 关于这个H5的图表有多可控我就不进行累述的,具体的内容大家可以参考Echart官网进行查看。其实选这个还有一个目的就是,这个整体的空间还有一家大公司来维护,总感觉爽爽的。 然后我今开始了我的封装之旅,经过了几百年的封装,终于弄出了一个稍微可以用的控件,又兴趣的童鞋可以拿来用用或者研究下。不过还有好多内容还有没有封装好。具体的下载地址可以通过Github上来下载:https://github.com/Pluto-Y/iOS-Echarts 如何使用 有两种方法可以使用: 通过cocoapods进行导入:pod 'iOS-Echarts' 将项目下的iOS-Echarts目录拷贝到项目中 在需要使用的地方引入PYEchartsView.h和PYOption.h。 最后只需通过对图表的属性进行配置即可。 至于其中的参数与文档可以参考上方的Echart官网进行查看与配置。…