iOS开发ReactiveCocoa学习笔记(四)

ReactiveCocoa常见操作方法介绍:

demo地址:https://github.com/SummerHH/ReactiveCocoa.git

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008400 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008400; min-height: 13.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px "PingFang SC"; color: #008400 }
span.s1 { }
span.s2 { font: 11.0px "PingFang SC" }
span.s3 { font: 11.0px Menlo }

1.1 ReactiveCocoa操作须知

所有的信号(RACSignal)都可以进行操作处理,因为所有操作方法都定义在RACStream.h中,而RACSignal继承RACStream。

1.2 ReactiveCocoa操作思想

运用的是Hook(钩子)思想,Hook是一种用于改变API(应用程序编程接口:方法)执行结果的技术.

Hook用处:截获API调用的技术。

Hook原理:在每次调用一个API返回结果之前,先执行你自己的方法,改变结果的输出。

RAC开发方式:RAC中核心开发方式,也是绑定,之前的开发方式是赋值,而用RAC开发,应该把重心放在绑定,也就是可以在创建一个对象的时候,就绑定好以后想要做的事情,而不是等赋值之后在去做事情。

列如:把数据展示到控件上,之前都是重写控件的setModel方法,用RAC就可以在一开始创建控件的时候,就绑定好数据。

1.3 ReactiveCocoa核心方法bind

ReactiveCocoa操作的核心方法是bind(绑定),给RAC中的信号进行绑定,只要信号一发送数据,就能监听到,从而把发送数据改成自己想要的数据。

在开发中很少使用bind方法,bind属于RAC中的底层方法,RAC已经封装了很多好用的其他方法,底层都是调用bind,用法比bind简单.

bind方法简单介绍和使用。

// 假设想监听文本框的内容,并且在每次输出结果的时候,都在文本框的内容拼接一段文字“输出:”

 // 方式一:在返回结果后,拼接。
 [_textField.rac_textSignal subscribeNext:^(id x) {

 NSLog(@"输出:%@",x);

 }];

 // 方式二:在返回结果前,拼接,使用RAC中bind方法做处理。
 // bind方法参数:需要传入一个返回值是RACStreamBindBlock的block参数
 // RACStreamBindBlock是一个block的类型,返回值是信号,参数(value,stop),因此参数的block返回值也是一个block。

 // RACStreamBindBlock:
 // 参数一(value):表示接收到信号的原始值,还没做处理
 // 参数二(*stop):用来控制绑定Block,如果*stop = yes,那么就会结束绑定。
 // 返回值:信号,做好处理,在通过这个信号返回出去,一般使用RACReturnSignal,需要手动导入头文件RACReturnSignal.h。

 // bind方法使用步骤:
 // 1.传入一个返回值RACStreamBindBlock的block。
 // 2.描述一个RACStreamBindBlock类型的bindBlock作为block的返回值。
 // 3.描述一个返回结果的信号,作为bindBlock的返回值。
 // 注意:在bindBlock中做信号结果的处理。

 // 底层实现:
 // 1.源信号调用bind,会重新创建一个绑定信号。
 // 2.当绑定信号被订阅,就会调用绑定信号中的didSubscribe,生成一个bindingBlock。
 // 3.当源信号有内容发出,就会把内容传递到bindingBlock处理,调用bindingBlock(value,stop)
 // 4.调用bindingBlock(value,stop),会返回一个内容处理完成的信号(RACReturnSignal)。
 // 5.订阅RACReturnSignal,就会拿到绑定信号的订阅者,把处理完成的信号内容发送出来。

 // 注意:不同订阅者,保存不同的nextBlock,看源码的时候,一定要看清楚订阅者是哪个。
 // 这里需要手动导入#import <ReactiveCocoa/RACReturnSignal.h>,才能使用RACReturnSignal。

 [[_textField.rac_textSignal bind:^RACStreamBindBlock{

 // 什么时候调用:
 // block作用:表示绑定了一个信号.

 return ^RACStream *(id value, BOOL *stop){

 // 什么时候调用block:当信号有新的值发出,就会来到这个block。

 // block作用:做返回值的处理

 // 做好处理,通过信号返回出去.
 return [RACReturnSignal return:[NSString stringWithFormat:@"输出:%@",value]];
 };

 }] subscribeNext:^(id x) {

 NSLog(@"%@",x);

 }];

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000 }
span.s1 { }

flattenMap

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px "PingFang SC"; color: #000000 }
span.s1 { }
span.s2 { font: 11.0px "PingFang SC" }
span.s3 { color: #272ad8 }
span.s4 { font: 11.0px Menlo }
span.s5 { font: 11.0px Menlo; color: #272ad8 }

flattenMap使用步骤:

1.传入一个block,block类型是返回值RACStream,参数value

2.参数value就是源信号的内容,拿到源信号的内容做处理

3.包装成RACReturnSignal信号,返回出去。

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px "PingFang SC"; color: #000000 }
span.s1 { }
span.s2 { font: 11.0px "PingFang SC" }
span.s3 { color: #272ad8 }
span.s4 { font: 11.0px Menlo }
span.s5 { font: 11.0px Menlo; color: #272ad8 }

flattenMap底层实现:

0.flattenMap内部调用bind方法实现的,flattenMap中block的返回值,会作为bind中bindBlock的返回值。

1.当订阅绑定信号,就会生成bindBlock。

2.当源信号发送内容,就会调用bindBlock(value, *stop)

3.调用bindBlock,内部就会调用flattenMap的block,flattenMap的block作用:就是把处理好的数据包装成信号。

4.返回的信号最终会作为bindBlock中的返回信号,当做bindBlock的返回信号。

5.订阅bindBlock的返回信号,就会拿到绑定信号的订阅者,把处理完成的信号内容发送出来。

 [[_textField.rac_textSignal flattenMap:^RACStream *(id value) {
        // block什么时候 : 源信号发出的时候,就会调用这个block。

        // block作用 : 改变源信号的内容。
        // 返回值:绑定信号的内容.
        return [RACReturnSignal return:[NSString stringWithFormat:@"输出:%@",value]];
    }] subscribeNext:^(id x) {
         // 订阅绑定信号,每当源信号发送内容,做完处理,就会调用这个block。
        NSLog(@"输出:flattenMap%@",x);
    }];

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000 }
span.s1 { }

map

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px "PingFang SC"; color: #000000 }
span.s1 { }
span.s2 { font: 11.0px "PingFang SC" }
span.s3 { color: #272ad8 }
span.s4 { font: 11.0px Menlo }
span.s5 { font: 11.0px Menlo; color: #272ad8 }

Map使用步骤:

1.传入一个block,类型是返回对象,参数是value

2.value就是源信号的内容,直接拿到源信号的内容做处理

3.把处理好的内容,直接返回就好了,不用包装成信号,返回的值,就是映射的值。

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px "PingFang SC"; color: #000000 }
span.s1 { }
span.s2 { font: 11.0px "PingFang SC" }
span.s3 { color: #272ad8 }
span.s4 { font: 11.0px Menlo }
span.s5 { font: 11.0px Menlo; color: #272ad8 }

Map底层实现:

0.Map底层其实是调用flatternMap,Map中block中的返回的值会作为flatternMap中block中的值。

1.当订阅绑定信号,就会生成bindBlock。

3.当源信号发送内容,就会调用bindBlock(value, *stop)

4.调用bindBlock,内部就会调用flattenMap的block

5.flattenMap的block内部会调用Map中的block,把Map中的block返回的内容包装成返回的信号。

5.返回的信号最终会作为bindBlock中的返回信号,当做bindBlock的返回信号。

6.订阅bindBlock的返回信号,就会拿到绑定信号的订阅者,把处理完成的信号内容发送出来。

    [[_textField.rac_textSignal map:^id(id value) {
        // 当源信号发出,就会调用这个block,修改源信号的内容
        // 返回值:就是处理完源信号的内容。
        return [NSString stringWithFormat:@"输出:%@",value];
    }] subscribeNext:^(id x) {

        NSLog(@"map输出%@",x);
    }];

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008400 }
span.s1 { }
span.s2 { font: 11.0px "PingFang SC" }

FlatternMap和Map的区别

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008400 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px "PingFang SC"; color: #008400 }
span.s1 { }
span.s2 { font: 11.0px "PingFang SC" }
span.s3 { font: 11.0px Menlo }

    1.FlatternMap中的Block返回信号。

2.Map中的Block返回对象。

3.开发中,如果信号发出的值不是信号,映射一般使用Map

4.开发中,如果信号发出的值是信号,映射一般使用FlatternMap。

总结:signalOfsignals用FlatternMap。

  //创建信号中的信号
    RACSubject *signalOfsignals = [RACSubject subject];
    RACSubject *signal = [RACSubject subject];

    [[signalOfsignals flattenMap:^RACStream *(id value) {

        //当signalOfsignals的signals发出信号才会调用
        return value;
    }] subscribeNext:^(id x) {
        // 只有signalOfsignals的signal发出信号才会调用,因为内部订阅了bindBlock中返回的信号,也就是flattenMap返回的信号。
        // 也就是flattenMap返回的信号发出内容,才会调用。

        NSLog(@"%@aaa",x);
    }];

    // 信号的信号发送信号
    [signalOfsignals sendNext:signal];

    // 信号发送内容
    [signal sendNext:@1];

RAC操作之组合

1.concat

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px "PingFang SC"; color: #008400 }
span.s1 { }

按一定顺序拼接信号,当多个信号发出的时候,有顺序的接收信号

//一.concat:按一定顺序拼接信号,当多个信号发出的时候,有顺序的接收信号。
    RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@1];
        [subscriber sendCompleted];
        return nil;
    }];

    RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@2];
        [subscriber sendCompleted];

        return nil;
    }];

    // 把signalA拼接到signalB后,signalA发送完成,signalB才会被激活。
    RACSignal *concatSignal = [signalA concat:signalB];

    // 以后只需要面对拼接信号开发。
    // 订阅拼接的信号,不需要单独订阅signalA,signalB
    // 内部会自动订阅。
    // 注意:第一个信号必须发送完成,第二个信号才会被激活
    [concatSignal subscribeNext:^(id x) {

        NSLog(@"%@",x);
    }];

    // concat底层实现:
    // 1.当拼接信号被订阅,就会调用拼接信号的didSubscribe
    // 2.didSubscribe中,会先订阅第一个源信号(signalA)
    // 3.会执行第一个源信号(signalA)的didSubscribe
    // 4.第一个源信号(signalA)didSubscribe中发送值,就会调用第一个源信号(signalA)订阅者的nextBlock,通过拼接信号的订阅者把值发送出来.
    // 5.第一个源信号(signalA)didSubscribe中发送完成,就会调用第一个源信号(signalA)订阅者的completedBlock,订阅第二个源信号(signalB)这时候才激活(signalB)。
    // 6.订阅第二个源信号(signalB),执行第二个源信号(signalB)的didSubscribe
    // 7.第二个源信号(signalA)didSubscribe中发送值,就会通过拼接信号的订阅者把值发送出来.

2.then

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px "PingFang SC"; color: #008400 }
span.s1 { }
span.s2 { font: 11.0px Menlo }

用于连接两个信号,当第一个信号完成,才会连接then返回的信号

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px "PingFang SC"; color: #000000 }
span.s1 { font: 11.0px Menlo }
span.s2 { }
span.s3 { font: 11.0px Menlo; color: #272ad8 }

then:用于连接两个信号,当第一个信号完成,才会连接then返回的信号

注意使用then,之前信号的值会被忽略掉.

底层实现:1、先过滤掉之前的信号发出的值。2.使用concat连接then返回的信号

 [[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

        [subscriber sendNext:@1];
        [subscriber sendCompleted];

        return nil;

    }] then:^RACSignal *{
        return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            [subscriber sendNext:@2];
            return nil;
        }];
    }] subscribeNext:^(id x) {
        // 只能接收到第二个信号的值,也就是then返回信号的值
        NSLog(@"%@",x);
    }];

3merge

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px "PingFang SC"; color: #008400 }
span.s1 { }
span.s2 { font: 11.0px Menlo }

把多个信号合并为一个信号,任何一个信号有新值的时候就会调用.

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px "PingFang SC"; color: #000000 }
span.s1 { font: 11.0px Menlo }
span.s2 { }

merge: 把多个信号合并成一个信号

创建多个信号

    RACSignal *signalC = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

        [subscriber sendNext:@3];

        return [RACDisposable disposableWithBlock:^{
            NSLog(@"信号释放了");
        }];
    }];

    RACSignal *signalD = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@4];

        return [RACDisposable disposableWithBlock:^{
            NSLog(@"信号释放了");
        }];
    }];

    //合并信号.任何一个信号发送数据,都能监听到

    RACSignal *mergeSignal = [signalC merge:signalD];
    [mergeSignal subscribeNext:^(id x) {
        NSLog(@"合并信号,任何一个数据发送数据,都能监听到%@",x);
    }];

    // 底层实现:
    // 1.合并信号被订阅的时候,就会遍历所有信号,并且发出这些信号。
    // 2.每发出一个信号,这个信号就会被订阅
    // 3.也就是合并信号一被订阅,就会订阅里面所有的信号。
    // 4.只要有一个信号被发出就会被监听。

4.zipWith

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px "PingFang SC"; color: #008400 }
span.s1 { }
span.s2 { font: 11.0px Menlo }

把两个信号压缩成一个信号,只有当两个信号同时发出信号内容时,并且把两个信号的内容合并成一个元组,才会触发压缩流的next事件。

 RACSignal *signalE = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@5];

        return [RACDisposable disposableWithBlock:^{

        }];
    }];

    RACSignal *signalF = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@6];

        return [RACDisposable disposableWithBlock:^{

        }];
    }];

    // 压缩信号A,信号B

    RACSignal *zipSignal = [signalE zipWith:signalF];

    [zipSignal subscribeNext:^(id x) {
        NSLog(@"压缩的信号%@",x);
    }];

    // 底层实现:
    // 1.定义压缩信号,内部就会自动订阅signalA,signalB
    // 2.每当signalA或者signalB发出信号,就会判断signalA,signalB有没有发出个信号,有就会把最近发出的信号都包装成元组发出。
    

5.combineLatest

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px "PingFang SC"; color: #008400 }
span.s1 { }
span.s2 { font: 11.0px Menlo }

将多个信号合并起来,并且拿到各个信号的最新的值,必须每个合并的signal至少都有过一次sendNext,才会触发合并的信号.

 RACSignal *signalG = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@5];

        return [RACDisposable disposableWithBlock:^{

        }];
    }];

    RACSignal *signalH = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@6];

        return [RACDisposable disposableWithBlock:^{

        }];
    }];

    // 把两个信号组合成一个信号,跟zip一样,没什么区别
    RACSignal *combineSignal = [signalG combineLatestWith:signalH];

    [combineSignal subscribeNext:^(id x) {
       NSLog(@"把两个信号组合成一个信号%@",x);
    }];

    // 底层实现:
    // 1.当组合信号被订阅,内部会自动订阅signalA,signalB,必须两个信号都发出内容,才会被触发。
    // 2.并且把两个信号组合成元组发出。

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008400 }
span.s1 { }
span.s2 { font: 11.0px "PingFang SC" }

6.reduce聚合

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px "PingFang SC"; color: #008400 }
span.s1 { }

用于信号发出的内容是元组,把信号发出元组的值聚合成一个值

 RACSignal *signalL = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@5];

        return [RACDisposable disposableWithBlock:^{

        }];
    }];

    RACSignal *signalM = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@6];

        return [RACDisposable disposableWithBlock:^{

        }];
    }];

    RACSignal *reduceSignal = [RACSignal combineLatest:@[signalL,signalM] reduce:^id(NSNumber *num1, NSNumber *num2){
        return [NSString stringWithFormat:@"reduce聚合%@ %@",num1,num2];
    }];

    [reduceSignal subscribeNext:^(id x) {
        NSLog(@"%@",x);

    }];

    // // 底层实现:
    // 1.订阅聚合信号,每次有内容发出,就会执行reduceblcok,把信号内容转换成reduceblcok返回的值。

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008400 }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008400 }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008400 }
span.s1 { }

时间: 2024-12-09 16:54:57

iOS开发ReactiveCocoa学习笔记(四)的相关文章

iOS开发ReactiveCocoa学习笔记(-)

学习 RAC 我们首先要了解 RAC 都有哪些类 RACSignal RACSubject RACSequence RACMulticastConnection RACCommand 在学习的时候写了一个小 demo 来分别介绍每个类的作用,gitHub 地址: https://github.com/SummerHH/ReactiveCocoa.git demo 的目录结构如下 RAC学习起来的特点 学习起来比较难 团队开发的时候需要谨慎使用 团队代码需要不断的评审,保证团队中所有人代码的风格一

iOS开发ReactiveCocoa学习笔记(二)

RAC 中常见的宏: 使用宏定义要单独导入 #import <RACEXTScope.h> 一. RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用于给某个对象的某个属性绑定 只要文本框文字改变,就会修改label的文字 RAC(self.labelView,text) = _textField.rac_textSignal; 二. RACObserve(self, name):监听某个对象的某个属性,返回的是信号. [RACObserve(self.view, cen

【iOS开发每日小笔记(四)】iOS 7中如何除去UIAlertView 规避delegate对象销毁后接收消息的crash

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.该分类的文章,内容涉及的知识点可能是很简单的.或是用很短代码片段就能实现的,但在我看来它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习.如果看官觉得太easy,太碎片,则可以有两个选择:1,移步[iOS探究]分类,对那里的文章进行斧正:2,在本文的评论

【iOS开发每日小笔记(六)】Swift语言学习的入门随想

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.该分类的文章,内容涉及的知识点可能是很简单的.或是用很短代码片段就能实现的,但在我看来它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习.如果看官觉得太easy,太碎片,则可以有两个选择:1,移步[iOS探究]分类,对那里的文章进行斧正:2,在本文的评论

ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习

首页 头条 文章 频道                         设计频道 Web前端 Python开发 Java技术 Android应用 iOS应用 资源 小组 相亲 频道 首页 头条 文章 小组 相亲 资源 设计 前端 Python Java 安卓 iOS 登录 注册 首页 最新文章 经典回顾 开发 Web前端 Python Android iOS Java C/C++ PHP .NET Ruby Go 设计 UI设计 网页设计 交互设计 用户体验 设计教程 设计职场 极客 IT技术

【iOS开发每日小笔记(九)】在子线程中使用runloop,正确操作NSTimer计时的注意点 三种可选方法

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习. 一直想写一篇关于runloop学习有所得的文章,总是没有很好的例子.正巧自己的上线App Store的小游戏<跑酷好基友>(https://itunes.apple.com/us/app/pao-k

【iOS开发每日小笔记(五)】实测copy到底是个神马玩意

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.该分类的文章,内容涉及的知识点可能是很简单的.或是用很短代码片段就能实现的,但在我看来它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习.如果看官觉得太easy,太碎片,则可以有两个选择:1,移步[iOS探究]分类,对那里的文章进行斧正:2,在本文的评论

IOS图层Layer学习笔记(二)—— CALayer(上)

IOS图层Layer学习笔记(二)-- CALayer(上) 简介 CALayer是所有图层的基类.主要是一些基本显示属性(位置.锚点.颜色.透明度等).层次关系(子图层和父图层).基本动画等. 接下来分别从常用属性.类方法和实例方法来介绍CALayer的使用.顺序是按头文件的排序来. 常用属性 bounds CGRect,Animatable.控制layer的大小,其中x和y无效果,默认是(0,0). position CGPoint,Animatable.控制layer锚点在父图层的位置.

【iOS开发每日小笔记(二)】gitHub上的开源“瀑布流”使用心得

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.该分类的文章,内容涉及的知识点可能是很简单的.或是用很短代码片段就能实现的,但在我看来它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下(^_^).其实,90%的作用是帮助自己回顾.记忆.复习.如果看官觉得太easy,太碎片,则可以有两个选择:1,移步[iOS探究]分类,对那里的文章进行斧正:2,在