Autolayout和Frame

现在iOS页面布局用的最多的就是Frame和Autolayout,在Autolayout通过Masonry封装在实际使用中也十分方便。实际上,Autolayout的约束最后都是系统最终转化成frame来进行布局的,对与一个View来说,最终确定其中心点位置和View的宽高。当Autolayout和Frame设置上产生冲突的时候,则会以Autolayout的设置为准。这篇主要讨论布局中常用的几个方法和autolayout遇到动画的情形。

阅读全文

KVC集合操作符

第一次遇到是在阅读AFNetworking中NSURLSession部分代码的时候:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
- (NSArray *)tasksForKeyPath:(NSString *)keyPath {

__block NSArray *tasks = nil;

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

[self.session getTasksWithCompletionHandler:^(NSArray *dataTasks,
NSArray *uploadTasks, NSArray *downloadTasks) {

if ([keyPath isEqualToString:NSStringFromSelector(@selector(dataTasks))
]) {

tasks = dataTasks;

} else if ([keyPath isEqualToString:NSStringFromSelector(@selector(
uploadTasks))]) {

tasks = uploadTasks;

} else if ([keyPath isEqualToString:NSStringFromSelector(@selector(
downloadTasks))]) {

tasks = downloadTasks;

} else if ([keyPath isEqualToString:NSStringFromSelector(@selector(
tasks))]) {

//dataTasks, uploadTasks, downloadTasks 都是数组,相当于打平数组,返回一个包含子数组各元素的数组。
tasks = [@[dataTasks, uploadTasks, downloadTasks] valueForKeyPath:
@"@unionOfArrays.self"];
}
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
return tasks;

}

KVC集合运算符允许以key path符号在一个集合中执行方法,以@开头表示一个特定的集合方法。键值编码会在必要的时候把基本数据类型进行装箱或者拆箱

它主要分为3类:1.简单集合操作符 2.对象操作符 3.数组和集合操作符

阅读全文

ReactiveCocoa1

RACSignal

RAC中统一的数据接口,控件的事件,包括KVO,timer都可以转化成RACSignal。

创建:

阅读全文

Runloop相关探索

Runloop 和 线程

CFRunloop中已经说明了一个线程及其runloop的对应关系,现在以iOS中NSThread的实际使用来说明runloop在线程中的意义。

阅读全文

MJRefresh

基本原理:

通过header view和 foot view 添加对scrollview contentOffset属性 kvo 实现动态刷新。在runtime对scrollview添加header的时候,在view的willMoveToSuperView生命周期方法中进行注册。

需要记忆理解的地方:

1.scrollview往上滑动的时候,contentOffsize的y是正数。scrollview往下滑动的时候,contentOffsize的y是负数。

2.header和footer的位置和大小是在view的layoutSubviews生命周期方法里设置的。

3.通过设置header或者footer的状态的时候控制其行为

小技巧:

1.在子类中调用了父类的方法,如果要求子类在其实现中必须调用父类的方法,可以在方法声明的时候添加 NS_REQUIRES_SUPER 宏,编译器在编译过程可进行检查。

阅读全文