使用RactiveCocoa实现slider调色板

    xiaoxiao2021-03-25  131

    使用ReactiveCocoa 实现简单的slider调色板 

    ReactiveCocoa的导入这里就不多说了,直接按照github上cocoapods导入很方便,附上链接:ReactiveCocoa的GitHub地址

    实现的效果如下:滑动slider,textfield联动改变,showView颜色变化;改变textfield值,slider跟随变化,showView颜色变化

    附上.m文件代码:

    // SliderController.m #import "SliderController.h" @import ReactiveObjC; @interface SliderController () @property (weak, nonatomic) IBOutlet UISlider *redSlider; @property (weak, nonatomic) IBOutlet UISlider *greenSlider; @property (weak, nonatomic) IBOutlet UISlider *blueSlider; @property (weak, nonatomic) IBOutlet UITextField *redTF; @property (weak, nonatomic) IBOutlet UITextField *greenTF; @property (weak, nonatomic) IBOutlet UITextField *blueTF; @property (weak, nonatomic) IBOutlet UIView *showView; @end @implementation SliderController CGFloat r, g, b; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. //预设初始值 _redTF.text = _greenTF.text = _blueTF.text = @"0.5"; //进行slider和textfield的绑定 RACSignal *redSignal = [self blindSlider:_redSlider Textfield:_redTF]; RACSignal *greenSignal = [self blindSlider:_greenSlider Textfield:_greenTF]; RACSignal *blueSignal = [self blindSlider:_blueSlider Textfield:_blueTF]; //将这三个信号量也进行合并,然后进行一次映射,combine是需要三个都有新值传过来时才进行合并 RACSignal *colorValueSignal = [[RACSignal combineLatest:@[redSignal,greenSignal,blueSignal]] map:^id _Nullable(id _Nullable value) { //这里生成的新信号量就是个颜色值了 return [UIColor colorWithRed:[value[0] floatValue] green:[value[1] floatValue] blue:[value[2] floatValue] alpha:1]; }]; //再次订阅,showView得到的值就是颜色值了 // [colorValueSignal subscribeNext:^(id _Nullable x) { // _showView.backgroundColor = x; // }]; //也可以采用宏,将目标对象和需要变化的属性值丢进去,对应属性值变化的信号量就好了,效果同上 RAC(_showView,backgroundColor) = colorValueSignal; } -(RACSignal *) blindSlider:(UISlider *)slider Textfield:(UITextField *)textfield{ //取一次textField值,且只取了一次,这样就不需要三个都变了才有反映了,因为绑定时三个都取了一次,都有值了 RACSignal *textSignal = [[textfield rac_textSignal]take:1]; //信号量的端,一个频道的断点,是信号量的子类 RACChannelTerminal *signalSlider = [slider rac_newValueChannelWithNilValue:nil]; RACChannelTerminal *signalText = [textfield rac_newTextChannel]; //两个终端相互订阅 [signalText subscribe:signalSlider]; //订阅slider时要对slider进行一次映射,因为slider返回的浮点型比较长,要格式化为str [[signalSlider map:^id _Nullable(id _Nullable value) { return [NSString stringWithFormat:@"%.2f",[value floatValue]]; }]subscribe:signalText]; //两个信号量合并成一个新信号量,只是将两个传出来的东西混杂在一起了 return [[signalText merge:signalSlider] merge:textSignal]; } @end 如果纯用OC代码写的话,代码量会比较大,这里采用ReactiveCocoa,只有短短三四十行代码就搞定了

    转载请注明原文地址: https://ju.6miu.com/read-20151.html

    最新回复(0)