2012-05-14 1 views
6

я в настоящее время с помощью следующей анимации на UITableViewCell:CABasicAnimation, как сделать это легко

CATransform3D rotationTransform = CATransform3DMakeRotation(1.0f * M_PI, 0, 0, 1.0); 
CABasicAnimation* rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; 

rotationAnimation.toValue = [NSValue valueWithCATransform3D:rotationTransform]; 
rotationAnimation.duration = 0.25f; 
rotationAnimation.cumulative = YES; 
rotationAnimation.repeatCount = 1; 

[cell.rotatingImage.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 

Однако при ~ 3 клетки анимированными выше анимации стали очень лага. Есть ли способ уменьшить это отставание?

+0

Я не думаю, что анимация чего-то внутри ячейки - хорошая идея, я обнаружил, что при прокрутке таблиц все, что использует CADisplayLink, приостанавливается (может быть, что-то еще). Возможно, вы могли бы попытаться оживить ТОЛЬКО активную ячейку или что-то в этом роде. – EmilioPelaez

+0

В моем случае я не знаю, какие ячейки будут с анимацией .. так что hardcode/statis не лучший вариант ... – LightNight

+1

Насколько велика изображение, которое вы вращаете? Какие другие свойства применяются к слою? С небольшим изображением я не замечаю отставание на своем iPhone 4. –

ответ

1

Первое, что я хотел бы удалить код создания анимации из метода -tableView:cellForRowAtIndexPath:, чтобы (скажем) viewDidLoad. Затем добавьте анимацию в ячейку в методе -tableView:cellForRowAtIndexPath:.

Создание объектов и расчет матриц являются дорогостоящими, поэтому их выполнение для каждого вызова -tableView:cellForRowAtIndexPath: будет замедлять ваш код.

В коде, я бы что-то похожее на следующее:

- (void) viewDidLoad 
{ 
    // Normal viewDidLoad code above 
    ... 

    // Assume that rotationAnimation is an instance variable of type CABasicAnimation*; 
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; 

    CATransform3D rotationTransform = CATransform3DMakeRotation(1.0f * M_PI, 0, 0, 1.0); 

    rotationAnimation.toValue = [NSValue valueWithCATransform3D:rotationTransform]; 
    rotationAnimation.duration = 0.25f; 
    rotationAnimation.cumulative = YES; 
    rotationAnimation.repeatCount = 1; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // create cell 
    ... 
    // Now apply the animation to the necessary layer. 
    [cell.rotatingImage.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 

    return cell; 
} 

ли это сделать?

+0

Вы проверили это? Ошибка приложения. – LightNight

+0

Да, вам нужно сохранить объект «rotationAnimation» следующим образом: 'rotationAnimation = [[CABasicAnimation animationWithKeyPath: @" transform "] сохранить];' –

+1

@MihaiFratu Спасибо, что указали это. – haroldcampbell