2012-05-18 5 views
0

У меня возникают некоторые проблемы в моем приложении. Ошибка возникает, когда я нахожусь на экране с большим количеством значков (UIViews), каждый из которых запускает анимацию. Этот экран напоминает экран трамплина, а визуализация анимации тоже похожа.Устройство зависает, когда есть много анимаций UIView, работающих с UILabels с использованием теней, и я нажимаю кнопку «Главная»

Итак, если я нажимаю кнопку «домой», приложение не переходит на задний план, и я ничего не могу сделать. Даже кнопка питания не работает. И иконы продолжают трястись.

Если я удалю вызов метода создания меток, этого не произойдет.

Любые советы?

Спасибо!

метод анимации (извлекается из 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]; 
    } 
} 

Создание этикетки

-(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]; 
    } 
} 

ответ

2

Проблема заключается в том:

Для каждого значка у меня есть много подвидов, поэтому расчеты каждого значка, во время анимации, в результате медленного кода.

Итак, я нашел немного света, чтобы решить эту проблему. Я создал одну и ту же структуру значков, но после этого я объединил в себе 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 o.o

Следуйте помощь, что я нашел Link

0

Тени не анимировать хорошо вообще. Отключите их во время анимации и верните их после завершения анимации.

У меня не было зависаний при анимации с тенями, но производительность неприемлемо отрывистая. По моему опыту, попытка оживить все, что имеет тени, дает неприемлемые результаты.

+0

Действительно, тени замедляет мой код слишком много. Но, мне нужно использовать тени, заказы от моей команды дизайнеров hahaha Спасибо –