所有的 HTTP 报文都可以分为两类:请求报文(request message)和响应报文(response message)

报文由三部分组成:对报文进行描述的起始行(start line)、包含属性的首部(header)块,以及可选的、包含数据的主体(body)部分

start line 和 header都是由行分隔的ASCII文本,标准http中以CRLF(换行符和回车符 \n\r)标记结尾。 body则可以是文本和二进制数据,也可以为空。header中标记body的一些信息,例如Content-Type说明body类型,都是MIME类型,Content-Length标记bo[……]

继续阅读

beginTime 动画开始时的延迟,比如延迟0.5秒执行,默认0,也就是马上开始

duration 动画持续时间,默认0

speed 动画速度,默认1,如果duration = 10,speed = 2, 那实际上动画5秒钟就执行完了。 设置为0会暂停动画,大于1会快进,0~1会减慢动画,小于0会倒退

timeOffset 动画快进到某一时间,不受speed影响,t = (tp – begin) * speed + offset

repeatCount 重复次数

repeatDuration 重复时间,和repeatCount不能同时设置

autoreve[……]

继续阅读

最近端时间在做国际化,遇到不同语言中如果要使语法通顺,就必须要更改占位符对应的参数顺序

如下句子在英文的时候没有问题,但是如果是中文,参数顺序就倒过来了

1
"Congratulations! You have got the %@ Verification on %@ %@."

怎么解决呢,在对应语言的.strings文件中加上 (下标 + $)就好,这里需要注意下标从1开始,不是从0开始,如下

1
"Congratulations! You have got the %@ Verification on %@ %@." = "你在%3$@ %2$@获得了%1$@认证!";

[……]

继续阅读

最近一段时间在接入Twitter SDK,发现简直是超级麻烦,怕忘记,所以记录一下

准备工作
1. 首先你得能翻越长城(废话)
2. 需要在 https://apps.twitter.com注册Twitter账号,然后申请应用并拿到consumerKey 和 consumerSecret (体力活儿不详述)
3. 需要在 https://fabric.io 注册fabric账号 (体力活儿不详述)
4. 安装CocoaPods(用于查找SDK的下载地址,本人鲁钝,没有找到公开的下载地址),天朝安装命令如下

1
// 替换Ruby gem sources, 淘宝源已经停止维护了,[......]<p class="read-more"><a href="https://gjh.me/321.html">继续阅读</a></p>

变换主要学习两种:仿射变换和3D变换

  • 仿射变换(CGAffineTransform):
  • 仿射变换采用3*3的二位矩阵乘法来进行变换,仿射的意义主要在于无论矩形怎么变换,平行的两条线在变换后依然平行,如图:
    仿射变换矩阵图

    计算过程如下:

    1
    2
    3
    = [x*a + y*c + 1*tx,
       x*b + y*d + 1*ty,
       x*0 + y*0 + 1*1] = [x', y', 1]

    主要用于在二维空间中进行平移,缩放,旋转,API提供了进行混合变换的方法,无需自己进行计算

    进行旋转是角度角度和弧度的转换公式:

    1
    #define DEGREES_TO_RADI[......]<p class="read-more"><a href="https://gjh.me/305.html">继续阅读</a></p>

    1. maskToBounds不仅会切掉超出边界的部分,还会切掉阴影,要想阴影出来可以在下面再加一个透明视图,用父视图的layer来展示阴影

    2. layer大多数的默认颜色都是黑色

    3. 阴影的初始值是CGSize(0, -3),阴影是往上便宜三个像素的,这是由于CoreAnimation最先诞生在OSX上,而OSX的坐标系跟iOS是镜像反转的

    4. 图层蒙版mask,通过这个属性可以设置一个有内容的layer为父layer的mask属性,mask图层的颜色无所谓,它的作用是让父视图保留mask图层内实心部分的内容,以做到不规格的裁切

    5. 拉伸过滤,分为minifi[……]

    继续阅读

    frame:在父视图或父layer中的绝对坐标,修改它将会影响显示的位置和大小
    bounds:可以看做是一个内部坐标,改变它可以整体改变subViews或者subLayer的显示位置和大小
    center:当前视图的中心点在父视图上的坐标位置
    position:当前layer的锚点在父layer上的坐标位置
    anchorPoint:又一个采用单位坐标的属性,比较抽象,主要在动画场景使用比较多

    position是layer中的anchorPoint点在superLayer中的位置坐标。因此可以说, position点是相对suerLayer的,anchorPoint点是相对layer[……]

    继续阅读

    1. 需要注意,UIView的-drawRect:方法没有默认的实现,而且如果UIView检测到-drawRect: 方法被调用了,它就会为视图分配一个寄宿图,这个寄宿图的像素尺寸等于视图大小乘以 contentsScale的值。所以如果不需要寄宿图,有没有其他的绘制需求,那么不要在UIView的子类中写一个-drawRect:方法,因为会造成CPU和内存资源的浪费。

    2. UIView在视图显示在屏幕的时候会自动调用CALayer的display方法,然后视图会在默认的基础上根据设置进行重绘。CALayer则不会在在屏幕上展示的时候自动刷新,控制权完全交给了开发者,第一次显示的时候只会[……]

    继续阅读

    1. contents 用于显示图片,这个属性虽然类型是id,但只能接受CGImageRef和NSImage对象,其它对象就会得到一个空白图层,需要注意OC中传递参数需要用到toll-free bridging,将CGImageRef转换为OC对象

    1
    layer.contents = (__bridge id)image.CGImage;

    2. contentGravity 用于调整内容在图层中的边界怎么对齐,它是一个NSString型,值如下

    1
    `center', `top', `bottom', `left', `right', `topLeft', `topRight', `b[......]<p class="read-more"><a href="https://gjh.me/271.html">继续阅读</a></p>

    1. Cocoa中视图和Layer都是树形结构。视图可以处理事件,例如鼠标点击和手势触控,视图在层级中可以相互嵌套,一个视图可以管理它的所有子视图。Layer也可以树形嵌套,父Layer也可以管理子Layer的位置等属性,但Layer不处理用户的交互,所以Layer并不清楚具体的响应链(虽然Layer提供了一些方法判断一个触控点是否在图层内,但这属于图层几何学范畴)。

    2. 每个视图都有一个CALayer实例的涂层属性,视图的职责就是创建和管理这个图层,以确保当子视图在层级关系中添加或者被移除的时候,他们关联的图层也同样对应在层级关系树当中有相同的操作。

    3.为什么要基于UIVie[……]

    继续阅读