2012-05-14 33 views
6

Tôi hiện đang sử dụng các hình ảnh động sau trên một UITableViewCell:CABasicAnimation làm thế nào để làm cho nó dễ dàng

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"]; 

Tuy nhiên, khi ~ 3 tế bào được hoạt hình như trên các hình ảnh động trở nên rất lag. Có cách nào tôi có thể giảm độ trễ này không?

+0

Tôi không nghĩ rằng việc tạo hoạt ảnh bên trong một ô là một ý tưởng hay, tôi thấy rằng khi các bảng đang cuộn, những thứ sử dụng CADisplayLink bị tạm dừng (có thể là một thứ khác). Có thể bạn chỉ có thể cố gắng tạo hiệu ứng động cho ô hiện hoạt hoặc thứ gì đó dọc theo các dòng đó. – EmilioPelaez

+0

Trong trường hợp của tôi, tôi không biết các ô nào sẽ có hình động .. vì vậy hardcode/statis không phải là biến thể tốt nhất ... – LightNight

+1

Hình ảnh bạn đang xoay lớn bao nhiêu? Các thuộc tính khác được áp dụng cho lớp đó là gì? Với một hình ảnh nhỏ, tôi không nhận thấy độ trễ trên iPhone của tôi 4. –

Trả lời

1

Điều đầu tiên tôi sẽ xóa mã tạo hình động từ phương thức -tableView:cellForRowAtIndexPath: thành (nói) viewDidLoad. Sau đó, thêm hoạt ảnh vào ô trong phương thức -tableView:cellForRowAtIndexPath:.

Tạo đối tượng và tính toán ma trận là tốn kém, do đó, thực hiện chúng cho mỗi cuộc gọi đến -tableView:cellForRowAtIndexPath: sẽ làm chậm mã của bạn.

Trong mã, tôi muốn có một cái gì đó tương tự như sau:

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

Điều này làm điều đó?

+0

Bạn đã thử nghiệm điều này chưa? Ứng dụng gặp sự cố. – LightNight

+0

Vâng: bạn cần phải giữ lại đối tượng 'rotationAnimation' như sau: ' rotationAnimation = [[CABasicĐộng tác hình ảnhWithKeyPath: @ "transform"] giữ lại]; ' –

+1

@MihaiFratu Cảm ơn bạn đã chỉ ra điều đó. – haroldcampbell

Các vấn đề liên quan