Objective c 按顺序更改UIView的属性,但不更改动画?

Objective c 按顺序更改UIView的属性,但不更改动画?,objective-c,ios,animation,xamarin.ios,Objective C,Ios,Animation,Xamarin.ios,我想创建一个闪烁效果,类似于打开荧光灯。这个过程大约需要2秒钟。由于它位于黑色背景上(图像为白色),我可以按如下顺序调整alpha: 0.5sec Alpha = 1.0; 0.15sec Alpha = 0.0; 0.4sec Alpha = 1.0; 0.35sec Alpha = 0.0; 0.3sec Alpha = 1.0; 0.1sec Alpha = 0.0; ~ Alpha = 1.0; CAKeyframeAnimation* animati

我想创建一个闪烁效果,类似于打开荧光灯。这个过程大约需要2秒钟。由于它位于黑色背景上(图像为白色),我可以按如下顺序调整alpha:

0.5sec   Alpha = 1.0;
0.15sec  Alpha = 0.0;
0.4sec   Alpha = 1.0;
0.35sec  Alpha = 0.0;
0.3sec   Alpha = 1.0;
0.1sec   Alpha = 0.0;
~        Alpha = 1.0;
CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath: @"opacity"];
    animation.duration = 0.7f;
    animation.values   = [NSArray arrayWithObjects:
                          [NSNumber numberWithFloat:1.0f],
                          [NSNumber numberWithFloat:1.0f],
                          [NSNumber numberWithFloat:0.0f],
                          [NSNumber numberWithFloat:0.0f],
                          [NSNumber numberWithFloat:1.0f],

                          [NSNumber numberWithFloat:1.0f],
                          [NSNumber numberWithFloat:0.0f],
                          [NSNumber numberWithFloat:0.0f],
                          [NSNumber numberWithFloat:1.0f],
                          [NSNumber numberWithFloat:1.0f],

                          [NSNumber numberWithFloat:0.0f],
                          [NSNumber numberWithFloat:0.0f],
                          [NSNumber numberWithFloat:1.0f],
                          nil];
    animation.keyTimes = [NSArray arrayWithObjects:
                          [NSNumber numberWithFloat:0.1f],
                          [NSNumber numberWithFloat:0.2f],
                          [NSNumber numberWithFloat:0.2f],
                          [NSNumber numberWithFloat:0.3f],
                          [NSNumber numberWithFloat:0.3f],

                          [NSNumber numberWithFloat:0.4f],
                          [NSNumber numberWithFloat:0.4f],
                          [NSNumber numberWithFloat:0.5f],
                          [NSNumber numberWithFloat:0.5f],
                          [NSNumber numberWithFloat:0.6f],

                          [NSNumber numberWithFloat:0.6f],
                          [NSNumber numberWithFloat:0.7f],
                          [NSNumber numberWithFloat:0.7f],
                          nil];    

    [self.view.layer addAnimation:animation forKey:nil];   
在这一点上,alpha值为1.0,我想把它留在那里。问题是,我不能仅仅更改这些值,因为它们只是排队等待绘制,不会立即发生,相反,它们会在下次绘制UI时立即发生,不会留下闪烁效果

我也不能使用UIView.animate块,因为这将在指定的时间内对视图的alpha进行调整/设置动画,我不希望它平滑,我希望它在alpha级别之间立即闪烁


我可能会使用UIImageView图像帧动画,但我想知道有没有更干净、更快、更简单的方法?

使用NSTimer。这就是我要做的(psuedo代码):

如果你有一些闪烁模式,你可以做一些比长开关更好的东西,可能只是有一些类似的东西,比如
if(timeSpent%5==0){alpha=1.0;}或者{alpha=0.0;}

编辑:像这样的东西怎么样:

0.5sec   Alpha = 1.0;
0.15sec  Alpha = 0.0;
0.4sec   Alpha = 1.0;
0.35sec  Alpha = 0.0;
0.3sec   Alpha = 1.0;
0.1sec   Alpha = 0.0;
~        Alpha = 1.0;
CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath: @"opacity"];
    animation.duration = 0.7f;
    animation.values   = [NSArray arrayWithObjects:
                          [NSNumber numberWithFloat:1.0f],
                          [NSNumber numberWithFloat:1.0f],
                          [NSNumber numberWithFloat:0.0f],
                          [NSNumber numberWithFloat:0.0f],
                          [NSNumber numberWithFloat:1.0f],

                          [NSNumber numberWithFloat:1.0f],
                          [NSNumber numberWithFloat:0.0f],
                          [NSNumber numberWithFloat:0.0f],
                          [NSNumber numberWithFloat:1.0f],
                          [NSNumber numberWithFloat:1.0f],

                          [NSNumber numberWithFloat:0.0f],
                          [NSNumber numberWithFloat:0.0f],
                          [NSNumber numberWithFloat:1.0f],
                          nil];
    animation.keyTimes = [NSArray arrayWithObjects:
                          [NSNumber numberWithFloat:0.1f],
                          [NSNumber numberWithFloat:0.2f],
                          [NSNumber numberWithFloat:0.2f],
                          [NSNumber numberWithFloat:0.3f],
                          [NSNumber numberWithFloat:0.3f],

                          [NSNumber numberWithFloat:0.4f],
                          [NSNumber numberWithFloat:0.4f],
                          [NSNumber numberWithFloat:0.5f],
                          [NSNumber numberWithFloat:0.5f],
                          [NSNumber numberWithFloat:0.6f],

                          [NSNumber numberWithFloat:0.6f],
                          [NSNumber numberWithFloat:0.7f],
                          [NSNumber numberWithFloat:0.7f],
                          nil];    

    [self.view.layer addAnimation:animation forKey:nil];   

但这是行不通的,因为在UI线程重新绘制alpha(或视图的任何属性)之前,更改alpha都不会生效。我可以在每次调用SetNeedsDisplay()之后调用它,但这仍然不能保证它会立即发生。结果是一次应用所有更改,不会产生动画/闪烁。如果在较长时间内(如0.5秒+)发生变化,这将起作用,但当我试图模拟荧光灯泡打开时的闪烁时,一些闪烁将非常短(~0.1秒)。好的,那么CAKeyframeAnimation呢?请参阅我在编辑答案中所做的示例。将KeyFrameAnimation的CalculationMode属性设置为CAKeyFrameAnimation.CalculationDiscrete以防止值插值。它是线性的。@chebum,谢谢,这是我想要的实际答案,停止tweening/值插值。干杯,伙计们!