【问题标题】:Change a properties of UIView in sequence, but without animation?依次更改 UIView 的属性,但没有动画?
【发布时间】:2012-07-23 11:18:37
【问题描述】:

我想创建一个闪烁效果,类似于打开荧光灯。该序列大约需要 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;

此时,alpha 为 1.0,我想把它留在那里。问题是我不能只更改这些值,因为它们只会排队等待绘制并且不会立即发生,而是会在下次绘制 UI 时立即发生,让我没有闪烁效果。

我也不能使用 UIView.animate 块,因为它会在指定的时间内对视图的 alpha 进行补间/动画处理,我不希望它平滑,我希望它在 alpha 级别之间立即闪烁。

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

【问题讨论】:

    标签: objective-c ios animation xamarin.ios


    【解决方案1】:

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

    timer = new scheduledTimer(0.5 seconds) selector:flicker() repeats:YES;
    timeSpent = 0;
    
        flicker()
        {
            timeSpent+= 5;
            switch(seconds)
                 case 5: alpha = 1.0; break;
                 case 15: alpha = 0.0; break;
        ...
            case 120: alpha = 1.0; [timer invalidate]; break;
    
        }
    

    如果你对闪烁有一些模式,你可以做一些比长开关更好的东西,也许只是像if (timeSpent % 5 == 0) { alpha = 1.0; } else { alpha = 0.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(或视图的任何属性)在 UI 线程重绘之前不会生效。我可以在每个之后调用 SetNeedsDisplay() ,但这仍然不能保证它会立即发生。结果是一次应用所有更改,导致没有动画/闪烁。如果更改时间较长(例如 0.5 秒 +),这将起作用,但是当我试图模拟荧光灯泡打开时的闪烁时,一些闪烁将非常短(~0.1 秒)。
    • 好的,那 CAKeyframeAnimation 呢?请参阅我在编辑答案时制作的示例。
    • 将 KeyFrameAnimation 的 CalculationMode 属性设置为 CAKeyFrameAnimation.CalculationDiscrete 以防止值插值。默认是线性的。
    • @chebum,谢谢,这是我正在寻找的实际答案,以停止补间/值插值。伙计们干杯!
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2011-02-28
    • 1970-01-01
    • 2013-01-19
    • 2023-04-05
    • 2012-06-02
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多