闪烁动画问题

Posted

技术标签:

【中文标题】闪烁动画问题【英文标题】:Blinking animation issue 【发布时间】:2014-09-09 15:23:47 【问题描述】:

我的视图控制器中的动画有问题。我有两个UIViews:蓝色视图和绿色视图。蓝色视图位于绿色视图之上。在绿色视图中,我有一个UIView,它是一个动画正弦波,另一个UIView 称为“recordingIndicatorView”,它由一个实现了闪烁动画的文本标签组成。当我向上滑动蓝色视图时,会显示绿色视图,正弦波视图开始动画,recordingIndicatorView 开始闪烁。当我向下滑动蓝色视图时,动画结束,正弦视图和recordingIndicatorView 被隐藏。

但是,如果我向上滑动蓝色视图,向下滑动,然后快速向上滑动蓝色视图,闪烁动画会被丢弃并开始更快地闪烁。

- (IBAction)handleUpSwipe:(UISwipeGestureRecognizer *)recognizer


    if(viewIsUp == NO)
            

         [self.sineWave animateWave];

         [self showSine];

         [UIView animateWithDuration:.25 delay:0 options:UIViewAnimationOptionCurveLinear animations:^

             [self moveViewsUp];

          completion:^(BOOL finished)

         ];

         stopBlinking = NO;

        [self.recordingIndicatorView setHidden:NO];
        [self flashOn:self.recordingIndicatorView];

     
 

- (IBAction)handleDownSwipe:(UISwipeGestureRecognizer *)recognizer


    if(viewIsUp == YES)
    

         [self stopRecording];

         if(self.panedView.frame.origin.y <0)
         

             [UIView animateWithDuration:.25 delay:0 options:UIViewAnimationOptionCurveLinear animations:^

                [self hideSine];
                [self moveViewsDown];

          completion:^(BOOL finished)

        [self.sineWave.layer removeAllAnimations];

        ];

        
    


-(void) stopRecording

     stopBlinking = YES;
     [self hideSine];
     [self.recordingIndicatorView setHidden:YES];



- (void)flashOff:(UIView *)v

     [UIView animateWithDuration:.5 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^ 
        self.recordingIndicatorView.alpha = 0.01;  
          completion:^(BOOL finished) 

        if(stopBlinking == NO)
        
             [self flashOn:self.recordingIndicatorView];
        

    ];



- (void)flashOn:(UIView *)v

    [UIView animateWithDuration:.5 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^ 
         self.recordingIndicatorView.alpha = 1;
      completion:^(BOOL finished) 
         [self flashOff:self.recordingIndicatorView];
    ];


-(void) moveViewsDown

    if(viewIsUp)
    
    self.panedView.frame = CGRectOffset( self.panedView.frame, 0, 274);
    self.sineWave.frame = CGRectOffset(self.sineWave.frame, 0, 246);
    self.micImageView.frame = CGRectOffset(self.micImageView.frame, 0, 85.5);
    viewIsUp = NO;

    


 -(void) moveViewsUp

    if(!viewIsUp)
    
    self.panedView.frame = CGRectOffset(self.panedView.frame, 0, -274);
    self.sineWave.frame = CGRectOffset(self.sineWave.frame, 0, -246);
    self.micImageView.frame = CGRectOffset(self.micImageView.frame, 0, -85.5);
    viewIsUp = YES;
    

【问题讨论】:

【参考方案1】:

我认为你的闪烁动画被添加了不止一次。 viewIsUp 标志可能有些混乱。这是我在没有其他代码的情况下所能找到的。并且尽量不要在块中使用self,这是一个坏习惯,会导致隐藏错误和内存泄漏,请改用weak self,例如:

__weak typeof(self) wSelf = self;
[UIView animateWithDuration:.25 delay:0 options:UIViewAnimationOptionCurveLinear animations:^
    [wSelf hideSine];
    [wSelf moveViewsDown];
 completion:^(BOOL finished)
    [wSelf.sineWave.layer removeAllAnimations];
];

【讨论】:

我从未听说过使用 self 和 blocks 的问题。感谢您的提醒。当您说动画被多次添加时,您认为当我向上滑动时,“flashOn”会被多次调用吗? 是的,我认为如果 viewIsUp 标志没有正确更新是可能的。

以上是关于闪烁动画问题的主要内容,如果未能解决你的问题,请参考以下文章

WPF动画有撕裂和闪烁

Css悬停动画闪烁/循环

是啥导致我的动画闪烁

MUI 中的闪烁动画

iPad:图像动画,图像闪烁问题

为啥 PyGame 动画闪烁