1.6k 1 分钟

这几天事情超多,实在很难静下心来研究一个东西,但是这个类我也是关注好久了,早就想总结下写出来, 可能这篇文章并不会像之前额那样那么详细,按理说写动画相关的东西应该是配 gif 的,但是真的是没有心思再去搞那些东西,代码并不难,大家可以照着代码写一下看下效果。
为了实现动力 UI,需要注册一套 UI 行为的体系,之后 UI 便会按照预先的设定进行运动了。我们应该了解的新的基本概念有如下四个:
UIDynamicItem:用来描述一个力学物体的状态,其实就是实现了 UIDynamicItem 委托的对象,或者抽象为有面积有旋转的质点; 简单的说就是一个控件,就是你想往谁上面加动画,这个就是谁。
UIDynamicBehavior:动力行为的描述,用来指定 UIDynamicItem 应该如何运动,即定义适用的物理规则。一般我们使用这个类的子类对象来对一组 UIDynamicItem 应该遵守的行为规则进行描述;简单的说就是动画效果,这个类是动画效果的一个父类,它的子类大家可以用运行时的方法输出一下看一下,或者一会看我介绍,一个子类是一个效果,各种效果比如重力啊碰撞啊,链接啊之类的。
UIDynamicAnimator;动画的播放者,动力行为(UIDynamicBehavior)的容器,添加到容器内的行为将发挥作用;
ReferenceView:等同于力学参考系,如果你的初中物理不是语文老师教的话,我想你知道这是啥.. 只有当想要添加力学的 UIView 是 ReferenceView 的子 view 时,动力 UI 才发生作用。下面看下我们给一个 button 加一个重力下坠的动画 使用 self.View 做参考系来建立动画

1.9k 2 分钟

iOS 中有的时候我们控件要做成圆形 或者是切成圆角,这个时候我们一般都会使用.layer.cornerRadius  ->  clipsToBounds = YES 的属性来切,这样完全能达到我们的效果,但是如果一个界面上需要切圆角的控件很多,并且列表很长的时候,尤其是像 tableView 那样如果每一个 cell 上都有大量的控件需要切,那么就会非常卡顿,帧数严重下降 。其实原因就是这样设置会触发离屏渲染,比较消耗性能。注意:png 图片 UIImageView 处理圆角是不会产生离屏渲染的。(ios9.0 之后不会离屏渲染,ios9.0 之前还是会离屏渲染)。这里先说下离屏渲染:
###### iOS 的渲染机制:
CPU 计算好显示内容提交到 GPU,GPU 渲染完成后将渲染结果放入帧缓冲区,随后视频控制器会逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示。GPU 屏幕渲染有以下两种方式:
On-Screen Rendering
意为当前屏幕渲染,指的是 GPU 的渲染操作是在当前用于显示的屏幕缓冲区中进行。
Off-Screen Rendering
意为离屏渲染,指的是 GPU 在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。

3.8k 3 分钟

# CFNetwork 背景简介

CFNetwork 是 ISO 中一个比较底层的网络框架,C 语言编写,可以控制一些更底层的东西,如各种常用网络协议、socket 通讯等,我们通常使用的 NSURL 则更倾向于 API 数据请求等,虽然框架也提供了一些操作,但是远不如 CFNetwork 丰富。CFNetwork 已经接近于 UNIX 系统的 socket 通信了,使用 CFHttpMessageRef 进行 HTTP 连接的好处就是控制的粒度更细了,例如你可以设置 SSL 连接的 PeerName,证书验证的方式,还可以控制每个响应包的接收。不过 CFNetwork 本质上还是应用层上的封装的通用 API。使用者可以不用关心底层协议的实际细节。下图是 CFNetwork 在 iOS 系统中的位置 (图片来源于官方文档)。

3.1k 3 分钟

# 背景

前段时间在处理 iOS 端的 HTTPDNS 相关 SDK,在接入和测试环节发现大家对 HTTP 的整体请求流程包括 HTTP 劫持原理以及 HTTPDNS 的工作原理并不是太清楚,所以写下这边文章帮助大家深入 web 请求过程:如何发起请求,HTTP 协议解析,DNS 域名解析。

# HTTP 发起一个请求过程

当我们在手机端请求一个 @"www.baidu.com" 的域名的时候

  • 1. 请求到达运营商的 DNS 服务器并由其把这个域名解析成对应的 IP 地址。

  • 2. 根据 IP 地址在互联网上找到对应的服务器,向这个服务器发起一个 get\post 请求。

  • 3. 由这个服务器找到对应的资源原路返回给访问的用户。

1.4k 1 分钟

# 背景:

最近在做项目的时候发现运行在模拟器上图标丢失,变成了苹果默认的白板图标。因为一开始只在模拟器上出现,而且也确认没有人动过图标文件,所以没有在意,后来慢慢的该问题出现在真机上,一开始是只有 iPhone X,然后就是 iPhone 8,慢慢的变成不管是模拟器还是真机,所有 iOS11 系统的图标都没有了。接下来影响到的机型和系统越来越多。

6.2k 6 分钟

# 背景 最近在做 iOS 的 DNS 解析,顺便研究了下 iOS 端本地的 DNS 解析方式(localDNS), 也就是不依赖 Http 请求,而是用原始的 API 进行解析,虽然有 HttpDNS 但是考虑到成本、第三方服务稳定性的问题,LocalDNS 仍然是一个很重要的部分,在 iOS 系统下,localDNS 的解析方式有三种,下面主要对三种方式进行下利弊分析及简单的原理介绍。 # 方式一 这个也是我一开始在项目中使用的方式。 121:struct hostent *gethostbyname(const char *);2:struct...
5.5k 5 分钟

# 1:背景

从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算 (+、-、*、/) 都是叫位运算,即将符号位共同参与运算的运算。

我们每一种语言最终都会通过编译器转换成机器语言来执行,所以直接使用底层的语言就不需要便编译器的转换工作从而得到更高的执行效率,当然可读性可能会降低,这也是为什么汇编在大部分情况下有更快的速度。项目中合理的运用位运算能提高我们代码的执行效率。

在 iOS 系统中位运算多见于枚举中,其他地方很少见,因为位运算是底层的计算机语言,而在 iOS 开发中不管是 Objective—C 还是 Swift 都属于高级的编程语言,大量的位运算都被苹果封装了起来,我们只关心调用的接口不用关心内部的实现。

1
2
3
4
5
6
7
8
9
10
11
12
typedef NS_OPTIONS(NSUInteger, NSLayoutFormatOptions) {
NSLayoutFormatAlignAllLeft = (1 << NSLayoutAttributeLeft),
NSLayoutFormatAlignAllRight = (1 << NSLayoutAttributeRight),
NSLayoutFormatAlignAllTop = (1 << NSLayoutAttributeTop),
NSLayoutFormatAlignAllBottom = (1 << NSLayoutAttributeBottom),
NSLayoutFormatAlignAllLeading = (1 << NSLayoutAttributeLeading),
NSLayoutFormatAlignAllTrailing = (1 << NSLayoutAttributeTrailing),
.
.
.
.
}