2012-01-14 8 views
2

В симуляторе мой метод анимации работает плавно. К сожалению, кажется, что он очень рывком работает на iPhone 4.Моя анимация UIView вялая - как я могу оптимизировать следующий код?

Я не уверен на 100%, что лучший и быстрый способ сделать анимацию - так что все советы о том, как я могу оптимизировать или полностью изменить свой код на скорость эта анимация была бы очень оценена!

Примечания:

Это уже в основном потоке, так ли это сделать "dispatch_async (dispatch_get_main_queue()) называют несущественными или бесполезным?

Есть ли способ предварительно загрузить эту анимацию?

Есть ли способ увидеть, какая часть кода выполняет большую часть замедления?

Существует только около 3 или 4 вида в extensionView.subviews.

Я собрал с -О.

- (void)extendWithAnimation:(BOOL)animated; { 

    isExtended = YES; 
    extensionView.hidden = NO; 
    topShadowView.hidden = NO; 

    topShadowView.frame = CGRectMake(0, defaultHeight, topShadowView.frame.size.width, topShadowView.frame.size.height); 
    topShadowView.layer.bounds = CGRectMake(0, 0, topShadowView.frame.size.width, 0); 
    extensionView.frame = CGRectMake(0, defaultHeight - 8, DEVICE_WIDTH, extensionHeight + 8); 
    extensionView.layer.bounds = CGRectMake(0, 0, DEVICE_WIDTH, 0); 

    for (UIView *view in extensionView.subviews) { 
     view.transform = CGAffineTransformMakeTranslation(0, -(extensionHeight+8)); 
    } 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     if (animated) { 
      [UIView beginAnimations:nil context:nil]; 
      [UIView setAnimationDuration:0.3]; 
      [UIView setAnimationDelegate:self]; 
     } 

     extensionView.layer.bounds = CGRectMake(0, 0, DEVICE_WIDTH, extensionHeight + 8); 
     topShadowView.layer.bounds = CGRectMake(0, 0, topShadowView.frame.size.width, extensionHeight + 8); 

     for (UIView *view in extensionView.subviews) { 
      view.transform = CGAffineTransformIdentity; 
     } 

     if (animated) { 
      [UIView commitAnimations]; 
     } 
    }); 
} 

Решение:

решаемые (спасибо Аарон!).

Окрашенные тени убивают анимацию большое время! Не используйте основные свойства теневой графики, если вы планируете анимацию - в моем случае только несколько теней уменьшили частоту кадров в три раза.

+1

Эффект теневого рисования CALayer значительно улучшен, если вы указали shadowPath для слоя, вы можете попробовать это, прежде чем вырвать весь ваш код ... – jrturton

+0

@jrturton интересно, к сожалению, это не будет работать для UITextView, который где проблема для меня. Но для других с похожими проблемами, которые звучат как очень хорошая точка! –

ответ

8
  1. Ну, если код уже находится в главной очереди, то использование dispatch_async будет иметь накладные расходы.
  2. Я не знаю, если это поможет (я вроде сомневаюсь), но вы можете попробовать использовать [UIView animateWithDuration:.3 animations:{ code... }];
  3. В моем прошлом попытки справиться с тенями они имели тенденцию иметь довольно большой удар по производительности. Возможно, вы захотите оставить тени и слои в одиночку и вместо этого создать изменяемый размер тени PNG, который вы можете использовать в UIImageView, размещенном за представлением, которое вы хотите затенять.
+0

Спасибо!Теневое представление на самом деле является PNG, как вы предлагаете, хотя некоторые из задействованных подзонов визуализировали тени, поэтому, возможно, это проблема - постарайтесь скоро :) –

+0

Я согласен, что dispatch_async() не нужен, но GCD действительно, очень быстро ; Я был бы удивлен, если это добавит какое-либо значимое отставание. –

+0

@ Джордан Вероятно, я бы сначала удалил тени и посмотрел, как это работает. Если да, то вы можете добавить их обратно в PNG и повторите попытку. –

1

Запустите свой код через Инструменты (начните с Time Profiler). Какие звонки занимают больше всего времени во время анимации?

После того как вы профилировали его, запустите его через инструмент Core Animation и включите окраску вне экрана и непрозрачного содержимого. Это поможет изолировать общие графические проблемы.

Я также замечаю, что вы упоминаете тени. Если вы используете свойства тени CALayer, это, скорее всего, приведет к гибели вашей производительности. Но нам нужно больше информации, чтобы действительно прибить это.

Смежные вопросы