我正在尝试使用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,所以我为我的无知道歉。任何帮助都非常适合。
答案 0 :(得分:1)
嗯,你肯定有一个阻止保留周期。您需要使用__block或__weak说明符。见Blocks and Variables。您的问题可能与内存问题有关。
确保在完成后使第一个计时器无效。
为安全起见,您可能还想在尝试转换之前重置UIImageView上的转换。你可以这样做:
finger.transform = CGAffineTransformIdentity;