gpt4 book ai didi

ios - 插入动画和绑定(bind)

转载 作者:行者123 更新时间:2023-11-29 03:10:04 25 4
gpt4 key购买 nike

注意:我使用的是 ReactiveCocoaLayout用于基于信号的动画。

我有一个 UILabel,我想将其绑定(bind)到 View 模型上的 NSString* 属性。

RACSignal* statusSignal = [RACObserve(self, viewModel.status) distinctUntilChanged];

很简单。但是,现在我想添加一些精美的动画。当 status 发生变化时,我希望连续发生的事情:

  1. 淡出标签(alpha 从 1 -> 0)
  2. 将新文本应用于 UILabel
  3. 淡化标签(alpha 从 1 -> 0)

这是我到目前为止能够想到的:

RACSignal* statusSignal = [RACObserve(self, viewModel.status) distinctUntilChanged];

// An animation signal that initially moves from (current) -> 1 and moves from (current) -> 0 -> 1 after that
RACSignal* alphaValues = [[statusSignal flattenMap:^RACStream *(id _) {

// An animation signal that moves towards a value of 1
return [[[RACSignal return:@1]
delay:animationDuration]
animateWithDuration:animationDuration];

}] takeUntilReplacement:[[statusSignal skip:1] flattenMap:^RACStream *(id _) {

// An animation signal that moves towards a value of 0, waits for that to complete, then moves towards a value of 1
return [[[RACSignal return:@(0)]
animateWithDuration:animationDuration]
concat:[[[RACSignal return:@1]
delay:animationDuration]
animateWithDuration:animationDuration]];
}]];

RAC(self, statusLabel.alpha) = alphaValues;

// The initial status should be applied immediately. Combined with the initial animation logic above, this will nicely fade in the first
// status. Subsequent status changes are delayed by [animationDuration] in order to allow the "fade" animation (alpha from 1 -> 0) to
// finish before the text is changed.
RAC(self, statusLabel.text) = [[statusSignal take:1]
concat:[[statusSignal delay:animationDuration]
deliverOn:[RACScheduler mainThreadScheduler]]];

这行得通,但我无法摆脱它有点……设计的感觉。大部分复杂情况都来 self 的基本情况 - 初始文本应该淡入,后续文本更改应该淡出然后淡入。

关于如何简化或优化的任何想法?

最佳答案

我还没有使用过 RCL,所以如果我错误地使用了 -animateWithDuration:,请告诉我。

首先,我定义了一个信号,该信号发送 @YES 而不是第一个状态,并发送 @NO 而不是所有后续状态。这是通过利用 -bind: 运算符来完成的,该运算符允许通过 block 捕获自定义每个订阅者变量。

RACSignal *isFirstStatus = [statusSignal bind:^{
__block BOOL first = YES;
return ^(id _, BOOL *stop) {
BOOL isFirst = first;
first = NO;
return [RACSignal return:@(isFirst)];
};
}];

接下来,将 isFirstStatus+if:then:else: 一起使用初始动画信号,然后切换到永久动画信号。

RAC(self, statusLabel.alpha) = [[RACSignal
if:isFirstStatus
// Initially, an animation signal to 1.
then:[RACSignal return:@1]
// Subsequently, an animation signal to 0, then, to 1.
else:[[[RACSignal return:@1] delay:animationDuration] startWith:@0]]
animateWithDuration:animationDuration];

我一直在寻找一种方法来通过完成动画来处理带内文本属性更新,但没有找到我喜欢的东西。如果还没有好的方法的话,这可能是为此类场景向 RCL 添加运算符(operator)的机会。

关于ios - 插入动画和绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22329231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com