0

我正在尝试UIImageView使用CGAffineTransformMakeTranslation(). 此动画将重复,直到用户执行滑动,在教程中移动用户。所有这些都已经在正常运行,如下所示:

[UIView animateWithDuration:1.0 animations:^ {
    self.finger.alpha = 1.0; 
}completion:^(BOOL finished) {
    CGAffineTransform originalTransform = self.finger.transform;
    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseInOut animations:^ {

        self.finger.transform = CGAffineTransformMakeTranslation(-200, 0);
        self.finger.alpha = 0.0;

        }completion:^(BOOL finished) {

            self.finger.transform = originalTransform;
            NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(repeatSwipeAnimation1) userInfo:nil repeats:YES];
            self.swipeTimerForFinger1 = timer;
            NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
            [runLoop addTimer:self.swipeTimerForFinger1 forMode:NSDefaultRunLoopMode];
            [self.swipeTimerForFinger1 fire];


            }];

        }];

和选择器:

-(void)repeatSwipeAnimation1 {
    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseIn animations:^ {
    self.finger.alpha = 1.0;
}completion:^(BOOL finished) {
    CGAffineTransform originalTransform = self.finger.transform;
    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseInOut animations:^ {
        self.finger.transform = CGAffineTransformMakeTranslation(-200, 0);
        self.finger.alpha = 0.0;
    }completion:^(BOOL finished) {
        self.finger.transform = originalTransform;

    }];
}];
}

手指动画和翻译精美。

当我想用不同的手指和不同的计时器来做这件事时,问题就来了。我有相同的确切代码,但它是不同的手指和不同的计时器选择器。

发生的事情是计时器的选择器不会翻译 UIImageView,并且(更可怕的)当我调用该方法无效时,计时器不会无效。调试后,我看到第二个计时器正在调用第二个选择器,但只是没有表现(例如,没有翻译,第二个手指淡入太快)。

我假设我第一次调用 NSRunLoop 时需要以某种方式关闭它?这是第一次使用 NSRunLoop,所以我为我的无知道歉。任何帮助都非常有用。

4

1 回答 1

1

好吧,你肯定有一个块保留周期正在进行。您需要使用 __block 或 __weak 说明符。请参阅块和变量。您的问题可能与内存问题有关。

确保在完成后使第一个计时器无效。

为了安全起见,您可能还想在尝试转换之前重置 UIImageView 上的转换。你可以这样做:

finger.transform = CGAffineTransformIdentity;
于 2012-06-21T01:15:22.870 回答