ViewController销毁后,新的ViewController创建后,递归UIView动画继续

时间:2012-10-22 21:54:00

标签: iphone ios uiview uiviewcontroller uiviewanimation

更新

未销毁ViewController,未创建新的ViewController。这样:

TimerViewController * timerViewController = (TimerViewController *)[segue destinationViewController];

不会创建新实例。但是,这个

TimerViewController *timerViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"theID"];

一样。所以现在正在使用一个新实例,但同样的问题。

END UPDATE

我有一个简单的“模拟数字计时器”,其中分钟和秒可以平滑地动画来模拟数字轮的转动。这只是一个带有时间列表的ParentViewController,选择一个时间执行到TimerViewController的segue。 TimerViewController使用递归UIView动画来模拟时钟的倒计时。这很有效。

我希望用户能够转换到列表中的下一个计时器,而不必返回到ParentViewController以便选择它。这不行。

我尝试了很多变体,基本模式是TimerViewController要求它的委托(ParentViewController)弹出它,然后再次使用下一次从列表中查找TimerViewController。初始动画永远不会终止,初始的TimerViewController实例永远不会“死”。当我第二次转到TimerViewController时,使用我认为是一个新实例,第一个动画似乎仍在运行,动画的持续时间几乎是1.0秒,不在图表范围内(接近0。)。 / p>

我尝试过许多不同的,越来越绝望的方法来阻止原始动画并杀死原始实例。

ParentViewController.m

-(void) timerViewControllerDidSwipe  (TimerViewController *)controller {

  [self.navigationController  popViewControllerAnimated:NO];
  controller = nil; // ?
  [self performSegueWithIdentifier:@"ShowTimer" sender:self];

}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

if ([[segue identifier] isEqualToString:@"ShowTimer"])
{
    TimerViewController * timerViewController = (TimerViewController *)[segue destinationViewController];
    [timerViewController setDelegate:self];
}


TimerViewController.m  

-(void) swipe:(id)selector {
    // swipe left
     stop = YES; // ivar for ^after to not call [self animate]
    [self.delegate timerViewControllerDidSwipe:self];
}

-(void) animate {

// anim block here..

 void (^after) (BOOL) = ^(BOOL f) {

    if (duration % 60 == 0 && duration >= 60) {

         if (minutesAlt.center.y < minutes.center.y)
         {
             CGPoint a = minutes.center;
             a.y -= 2 * displacement;
             minutes.center = a;
             minutes.text = [NSString stringWithFormat:@"%02d", (duration / 60) -1];
         }
         else
         {
            CGPoint a = minutesAlt.center;
            a.y -= 2 * displacement;
            minutesAlt.center = a;
            minutesAlt.text = [NSString stringWithFormat:@"%02d", (duration / 60) -1];
         }
    }

    if (duration == 0)
    {
        // end
    }
    else if (secondsAlt.center.y < seconds.center.y)
    {
        CGPoint a = seconds.center;
        a.y -= 2 * displacement;
        seconds.center = a;
        duration--;
        seconds.text = [NSString stringWithFormat:@"%02d",duration % 60];

        if (!stop) {[self animate];}
    }
    else 
    {
        CGPoint a = secondsAlt.center;
        a.y -= 2 * displacement;
        duration--;
        secondsAlt.center = a;
        secondsAlt.text = [NSString stringWithFormat:@"%02d", duration % 60];

        if (!stop) {[self animate];}
    }
};


[UIView animateWithDuration:0.50
                      delay:0.50
                    options:UIViewAnimationOptionCurveLinear
                 animations:anim
                 completion:after];
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

在相关问题中修复了here。这是一个简单的语法错误(花了我几周的时间才发现)。