我正在尝试制作卷轴旋转的老虎机动画。为此,我使用drawRect在继承自UIView的自定义类中绘制图像。我正在使用nstimer来更新图像的位置并调用[self setNeedsDisplay]来更新图形。在模拟器中,它看起来非常好,但是,在设备上,它非常滞后。我想知道我的绘画方法是否有问题,或者是否有更好的解决方案。
- (void)drawRect:(CGRect)rect
{
[image1 drawInRect:CGRectMake(0, image1Position, 98, 80)];
[image2 drawInRect:CGRectMake(0, image2Position, 98, 80)];
[image3 drawInRect:CGRectMake(0, image3Position, 98, 80)];
}
- (void)spin
{
// move each position down by 10 px
image1Position -= MOVEMENT;
image2Position -= MOVEMENT;
image3Position -= MOVEMENT;
// if any of the position <= -60 reset to 180
if(image1Position < -50)
{
image1Position = 180;
}
if(image2Position < -50)
{
image2Position = 180;
}
if(image3Position < -50)
{
image3Position = 180;
}
[self setNeedsDisplay];
}
-(void)beginSpinAnimation
{
timer = [NSTimer scheduledTimerWithTimeInterval:SCROLL_TIME target:self selector:@selector(spin) userInfo:self repeats:YES];
}
使用UIScrollView我的CoreAnimation尝试:
- (void) spinToNextReel
{
int y = self.contentOffset.y + 80;
// if the current >= last element reset to first position (-30)
if(y >= (80 *(elementCount+1) - 30))
{
y = -30;
}
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:SCROLL_TIME];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
self.contentOffset = CGPointMake(0, y);
[UIView commitAnimations];
if (!isSpinning && targetY == y)
{
NSLog(@"target is %d, y is %d", targetY, y);
if(timer)
{
[timer invalidate];
timer = nil;
}
[self playSound];
}
}
答案 0 :(得分:4)
我会说对CoreAnimation进行研究。这是为了做你想做的事情。它会比你在这里做得快得多。
至于速度慢,调用drawInRect并不是世界上最快的事情。什么是SCROLL_TIME?
答案 1 :(得分:1)
您想要使用CoreAnimation,它将更容易,更高效。话虽如此,如果你坚持尝试以这种方式手动制作动画,那么你做错了几件事:
不要尝试按固定间隔移动恒定量,定时器事件可能会延迟,如果是这样会导致动画不均匀,因为每个事件移动的数量不变,而不是每个时间间隔。您应该在每次动画时记录实际时间戳,将其与上一个时间戳进行比较,并移动适当数量的像素。即使事件被延迟,这也会导致均匀的移动量(实际上你会丢帧)。
请勿使用NSTimer,请使用CADisplayLink。这会将您的绘图与系统的本机刷新率联系起来,并将其与正在进行的任何其他绘图同步。
我知道我已经说过了,但是学习并使用CoreAnimation,你会更开心。