Tôi đã sử dụng CAKeyframeAnimations để tạo hoạt ảnh cho các thuộc tính transform.rotation
và transform.translation.x
của lớp, nhưng tôi đang gặp sự cố khi kích hoạt thuộc tính transform
một cách hoàn toàn. Tôi có một lớp mà phải animate giữa hai tiểu bang và nội suy mặc định của CABasicAnimation là hoàn toàn không chính xác và không theo con đường tôi muốn. CAKeyframeHình ảnh để giải cứu, hoặc vì vậy tôi nghĩ. Bất kỳ nỗ lực nào để tạo hiệu ứng động transform
bằng cách sử dụng CAKeyframeKết quả tạo kết quả trong chế độ xem ngay lập tức chụp với biến đổi cuối cùng trong khi các hoạt ảnh khác chạy. Nếu tôi loại bỏ nửa đầu của hàm sau và để các sự kiện "biến đổi" của tôi sử dụng CABasicAnimation ở phía dưới, nó sẽ hoạt hình tốt - mặc dù với các biến đổi nội suy không chính xác trên đường đi.Làm cách nào để tạo hoạt ảnh cho CATransform3Ds bằng CAKeyframeAnimation?
lớp đại biểu của tôi đã thực hiện như sau:
- (id <CAAction>) actionForLayer:(CALayer *)layer forKey:(NSString *)event
{
if ([event isEqualToString:@"transform"])
{
CGSize startSize = ((CALayer *)self.layer.presentationLayer).bounds.size;
CGSize endSize = self.layer.bounds.size;
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:event];
animation.duration = 0.25;
NSMutableArray *values = [NSMutableArray array];
int stepCount = 10;
for (int i = 0; i < stepCount; i++)
{
CGFloat p = i/(float)(stepCount - 1);
CGSize size = [self interpolateBetweenSize:startSize andSize:endSize percentage:p];
CATransform3D transform = [self transformForSize:size];
[values addObject:[NSValue valueWithCATransform3D:transform]];
}
animation.values = values;
return animation;
}
// All other animations use this basic animation
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:event];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
animation.removedOnCompletion = YES;
animation.fillMode = kCAFillModeForwards;
animation.duration = 0.25;
return animation;
}
tôi chuyển đổi là bản dịch tiếp theo là một xoay, nhưng tôi nghĩ rằng một phim hoạt hình nhóm với hình ảnh động keyframe riêng biệt sinh động thông qua một dịch VÀ một xoay sẽ cho kết quả điên thị trấn. Tôi đã xác nhận rằng kích thước & biến đổi là chính xác cho tất cả các giá trị của p mà tôi vượt qua mặc dù và p đúng phạm vi từ 0 đến 1.
Tôi đã thử đặt chức năng thời gian không mặc định, tôi đã thử cài đặt một loạt các hàm thời gian, tôi đã bỏ qua keyTImes, tôi đã thiết lập một repeatCount là 0, removeOnCompletion = YES, và một fillMode của tiền đạo và điều đó không có hiệu lực. Tôi không tạo hoạt ảnh keyframe biến đổi chính xác phải không?
Bạn có thể làm rõ hiệu ứng chính xác mà bạn đang cố gắng đạt được không? Bạn mô tả nó như là một bản dịch theo sau bởi một vòng quay, nhưng từ mã của bạn có vẻ như các giới hạn cũng đang hoạt hình - điều đó có đúng không?Bạn muốn các lớp để di chuyển, sau đó xoay, với các bounds phát triển hoặc thu hẹp liên tục trong suốt cả hai giai đoạn của di chuyển/xoay hình ảnh động? – GSnyder
Tại sao cần phải ngầm định? Mã này trông rất khó hiểu. Nếu bạn muốn kiểm soát hạt mịn tại sao không chỉ tạo ra các hình ảnh động và thêm nó trực tiếp vào lớp, mà bạn nói rằng bạn đã làm việc chưa? Cũng chỉ cần trả về 'nil' từ phương thức ủy nhiệm đó nếu bạn muốn mọi thứ sử dụng hoạt ảnh mặc định của họ. –