当有很多使用阴影的UILabels运行的UIViewanimation时,设备会冻结,然后按Homebutton

我在应用程序中遇到了一些问题。 当我在屏幕上有很多图标(UIViews),每个运行一个animation时发生错误。 该屏幕提醒跳板屏幕,并且animation视觉也相似。

所以,如果我按主页button,应用程序不会去背景,我什么都不能做。 即使电源button不起作用。 图标继续晃动。

如果我删除了标签创build方法的调用,则不会发生这种情况。

有什么build议?

谢谢!

animation方法(从Three20 api中提取):

- (void)wobble { static BOOL wobblesLeft = NO; if (isEditing) { CGFloat rotation = (kWobbleRadians * M_PI) / 180.0; CGAffineTransform wobbleLeft = CGAffineTransformMakeRotation(rotation); CGAffineTransform wobbleRight = CGAffineTransformMakeRotation(-rotation); [UIView beginAnimations:nil context:nil]; NSInteger i = 0; NSInteger nWobblyButtons = 0; for(Icon *ic in iconList) { ++nWobblyButtons; i++; if (i % 2) { ic.transform = wobblesLeft ? wobbleRight : wobbleLeft; } else { ic.transform = wobblesLeft ? wobbleLeft : wobbleRight; } } if (nWobblyButtons >= 1) { [UIView setAnimationDuration:kWobbleTime]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(wobble)]; wobblesLeft = !wobblesLeft; } else { [NSObject cancelPreviousPerformRequestsWithTarget:self]; [self performSelector:@selector(wobble) withObject:nil afterDelay:kWobbleTime]; } [UIView commitAnimations]; } } 

标签创build

 -(void)layoutLabel { // If title isn`t builded. if(_lblName == nil) { // Create new label. _lblName = [[UILabel alloc] initWithFrame:CGRectMake(LABEL_POS_X, LABEL_POS_Y, LABEL_WIDTH, LABEL_HEIGHT)]; // Clear the background. [_lblName setBackgroundColor:[UIColor clearColor]]; // Sets the font. [_lblName setFont:[UIFont fontWithName:@"Helvetica-Bold" size:11.3]]; [_lblName setAdjustsFontSizeToFitWidth:NO]; // Sets text color [_lblName setTextColor:[UIColor whiteColor]]; // Adjust the number of lines. [_lblName setNumberOfLines:2]; // Adjust the aligment to center. [_lblName setTextAlignment:UITextAlignmentCenter]; // Adjust shadow like the springboad`s icons. _lblName.layer.shadowOpacity = 1.0; _lblName.layer.shadowRadius = 0.8; _lblName.layer.shadowColor = [[UIColor blackColor] CGColor]; _lblName.layer.shadowOffset = CGSizeMake(0, 1.2); // Add label to container. [self addSubview:_lblName]; } } 

问题是:

对于每个图标我有很多子视图,所以,在animation时间,每个图标的计算导致代码变慢。

所以,我find了一些解决这个问题的灯。 我build立了相同的图标结构,但之后,我在一个UIImage内合并了一个代码如下。

 + (UIImage *) imageWithView:(UIView *)view { UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); [view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return img; } 

这使我的FPS从15增加到60 Oo

按照我发现链接的一些帮助

阴影根本不会动起来。 在animation过程中禁用它们,并在animation完成后将其重新打开。

当阴影animation时,我没有冻结,但performance是不可接受的生涩。 根据我的经验,尝试制作任何有阴影的东西都会产生不可接受的结果。