前言
距离上一次更新已经是一年多以前了。回想起来这一年多过的老快了,好像啥也没做就过去了。自己也已经步入社会10个月了吧。年前的几个月感觉没什么区别,现在慢慢接触的人和东西多了以后感觉进入社会还真的和学校不太一样,不知道是不是因为公司里同龄人比较少的原因。大多数的人好像把甩锅放到了首位,而不是想第一时间先解决问题。官场气息有点高,总感觉自己比别人早来一段时间要厉害一些。有一股子颐指气使的味道。我自己还是很讨厌这种氛围的。感觉在这种环境中自己也会变成这样的人。努力保证自己变得慢一点吧。
说到自己其他的变化,好像变得不喜欢出门了。也许是这边没有认识的人的缘故吧。总感觉出门到处溜达如果不是认识的人一起会变得好累。还不如呆在屋子里就这样躺着发呆。我还真是闲的一。)
再说说能力吧,写码能力确实相比之前提升了一丢丢,但是还是差了好多。后续还是要开始刷leetcode了吧,不然自己的思维能力总是会差一些。面对一些问题,有时自己的思维总是要稍微差一点。对一个问题的思考方式也需要改变。我只希望在自己的不断业务开发里面能稍微提高一下自己的思考方式。
接下来几个月,我尽量保证自己一周更新一篇文章吧,也算是给自己定一个目标,然后积累自己最近了解的一些东西。然后一些题解,一些自己的观点啥的。那就从这一篇开始吧。
ios阴影不展示
记录一下今天遇到的阴影不展示的问题,这篇博客里面做出了详细的指导,感谢原作者。下面放了链接。
https://www.jianshu.com/p/0f24ad35788d
先描述一下今天遇到的问题,我在给一个view设置阴影的时候发现无论如何设置阴影都无法展示。一开始以为设置的方式有问题,然后查了一下阴影相关的一些属性:
1 | (CGColorRef *) shadowColor//阴影颜色 |
需要特别注意的一点是:在设置阴影的时候必须给view指定一个背景色,否则阴影是无法显示的。但是我这次遇到的这个问题是其他原因。当给一个view同时设置圆角和阴影时,圆角的效果可以展示,但是阴影的效果是没有的。这是因为在设置圆角是需要设置一个maskToBounds = yes的属性,这个动作会将子视图超过父视图的部分给clips掉,然后就会导致边缘的阴影是无法展示的。
因此正确的做法应该是重新引入一个视图作为当前视图的父视图,然后子视图只设置圆角,父视图负责设置阴影。当然这样做当子视图没有填满父视图的时候,会导致圆角看起来没有生效,所以这一点还是需要小心的。
ios 协议
这里主要总结一下iOS协议的一些基本只是和用法,主要包括以下两个部分。1、iOS协议的声明和使用。2、iOS协议,代理,委托,几个名词的含义和关系。3、iOS在协议中声明属性。
1、iOS协议的声明和使用
iOS协议的声明类似于C++中的纯虚函数。告诉外界如果遵守(继承)了这个协议,就有能力实现协议中声明的方法,进而完成一些类本身无法完成的事。
这样看起来和继承没什么区别。接下来加一些限制,在iOS开发中,伴随着协议还有一个名词,那就是代理(delegate)。试想这样一个场景,在一个页面容器中,包含两个子页面成为子页面1和子页面2。其中子页面2的数据来源需要依靠子页面1.现在的问题就是如何从子页面2拿到子页面1提供的数据。这里就可以使用协议了。方法如下:
声明一个协议A,子页面2继承协议A,但是子页面2无法完成协议A中的方法,因此使用代理将这些方法交给子页面1或者父容器去实现。具体要做的事就是取到子页面1中提供的数据,然后为子页面2提供数据源。这样就是一个协议完成工作的整个流程了。
2、iOS协议,代理,委托
协议:提供了可以解决一些问题的方法声明,但是没有实现,需要有能力实现的类去实现。(任务)
代理(delegate):上面所说的子页面2,子页面2无法完成数据请求,需要继承协议。那协议的实现需要其他类去帮忙完成。因此设置一个代理属性。(boss)
委托:实现协议的类。最后能够实现协议,完成功能的类。(开发)
3、iOS在协议中声明属性
在协议中是可以声明属性的。在一般的类中声明属性(property)的同时编译器会自动生成该属性的setter和getter方法和一个成员。但是在协议中声明属性的话是无法自动生成读取方法的。在继承协议时会有编译器警告,可以手动添加读取方法也可以使用关键字synthesize自动补全。同样的效果也发生在分类上。
tableview cell重用机制
iOS tableview cell 的重用在节约了很大的内存空间,并且在滑动过程中通过重用机制可以提升性能。而且通过model进行数据传递还可以解决滑动过程中cell重复的问题。
在重用机制主要依靠两个mutableArray:visiableCells和reusabelCells。如果某一次接口返回了20条数据,但是屏幕一次只能展示6条数据,那么前6条数据的展示就需要 initWithStyle:reuseIdentifier:初始化6个cell来展示,此时6个cell都是visible的,当滑动屏幕时,会创建第7个visible的cell,因为此时的reuseableCells是没有可用cell的。当出现第7个cell时第一个cell会消失,存储到reusableCells中,并从visibleCell中移除。然后继续滑动到第8个cell时,会通过”Identifier“字段判断当前cell是否可重用,如果可以重用,那么就从不在创建新的cell,而是使用第一个cell来进行展示 (1)。如果不可重用,那么创建一个新的cell并指定一个新的”identifer“。
需要注意的点:1.重用机制是通过reuseIdentify来实现的,要保证不出现问题,只需要保证数据类型一致。如果是特殊的数据,就重新使用一个identify来创建一个新的cell。