2011-09-21 37 views
7

Tôi thực sự đã gặp sự cố với hoạt ảnh UILabel trong Ứng dụng iOS của mình. Sau 2 ngày tìm kiếm các đoạn mã cho web, vẫn không có kết quả.Hoạt ảnh UILabel với CoreAnimation/QuartzCore trong Ứng dụng iOS

Mỗi mẫu tôi tìm thấy là về cách tạo hiệu ứng UIImage, thêm mẫu đó dưới dạng chế độ xem phụ vào UIView theo lớp. Có ví dụ hay về hoạt ảnh UILabel không? Tôi tìm thấy một giải pháp tốt đẹp cho một hình ảnh động nhấp nháy bằng cách thiết lập thuộc tính alpha, như thế này:

chức năng của tôi:

- (void)blinkAnimation:(NSString *)animationID finished:(BOOL)finished target:(UIView *)target 
{ 
    NSString *selectedSpeed = [[NSUserDefaults standardUserDefaults] stringForKey:@"EffectSpeed"]; 
    float speedFloat = (1.00 - [selectedSpeed floatValue]); 

    [UIView beginAnimations:animationID context:target]; 
    [UIView setAnimationDuration:speedFloat]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(blinkAnimation:finished:target:)]; 

    if([target alpha] == 1.0f) 
     [target setAlpha:0.0f]; 
    else 
     [target setAlpha:1.0f]; 
    [UIView commitAnimations]; 
} 

Gọi chức năng của tôi trên UILabel:

[self blinkAnimation:@"blinkAnimation" finished:YES target:labelView]; 

Nhưng làm thế nào về một Pulse, hoặc hình ảnh động thu nhỏ?

Trả lời

13

Thật không may kích thước phông chữ không phải là thuộc tính có thể hoạt hình của NSView. Để mở rộng quy mô một UILabel, bạn sẽ cần phải sử dụng Core Animation kỹ thuật tiên tiến hơn, sử dụng CAKeyframeAnimation:

  1. nhập các QuartzCore.framework vào dự án của bạn, và #import <QuartzCore/QuartzCore.h> trong mã của bạn.
  2. Tạo đối tượng CAKeyframeAnimation mới mà bạn có thể thêm khung hình chính vào.
  3. Tạo giá trị CATransform3D xác định hoạt động mở rộng quy mô (không bị nhầm lẫn bởi phần 3D - bạn sử dụng đối tượng này để làm bất kỳ biến đổi nào trên một lớp).
  4. Biến đổi một trong các khung hình chính trong hoạt ảnh bằng cách thêm nó vào đối tượng CAKeyframeAnimation bằng cách sử dụng phương thức setValues của nó.
  5. Thiết lập một thời gian cho phim hoạt hình bằng cách gọi phương pháp setDuration
  6. Cuối cùng, thêm các hình ảnh động để lớp của nhãn sử dụng [[yourLabelObject layer] addAnimation:yourCAKeyframeAnimationObject forKey:@"anyArbitraryString"]

Các mã cuối cùng có thể trông giống như thế này:

// Create the keyframe animation object 
CAKeyframeAnimation *scaleAnimation = 
    [CAKeyframeAnimation animationWithKeyPath:@"transform"]; 

// Set the animation's delegate to self so that we can add callbacks if we want 
scaleAnimation.delegate = self; 

// Create the transform; we'll scale x and y by 1.5, leaving z alone 
// since this is a 2D animation. 
CATransform3D transform = CATransform3DMakeScale(1.5, 1.5, 1); // Scale in x and y 

// Add the keyframes. Note we have to start and end with CATransformIdentity, 
// so that the label starts from and returns to its non-transformed state. 
[scaleAnimation setValues:[NSArray arrayWithObjects: 
        [NSValue valueWithCATransform3D:CATransform3DIdentity], 
        [NSValue valueWithCATransform3D:transform], 
        [NSValue valueWithCATransform3D:CATransform3DIdentity], 
        nil]]; 

// set the duration of the animation 
[scaleAnimation setDuration: .5]; 

// animate your label layer = rock and roll! 
[[self.label layer] addAnimation:scaleAnimation forKey:@"scaleText"]; 

Tôi sẽ để hoạt ảnh "xung" lặp lại như một bài tập cho bạn: gợi ý, nó liên quan đến phương pháp animationDidStop!

Một lưu ý khác - danh sách đầy đủ các thuộc tính có thể hoạt hóa CALayer (trong đó "chuyển đổi" là thuộc tính) có thể được tìm thấy here. Chúc mừng tweening!

+0

Cảm ơn rất nhiều câu trả lời chi tiết của bạn. Tôi đã giải quyết được vấn đề, sử dụng CABasicAnimation với bộ hẹn giờ. Tôi chắc rằng mã của bạn cũng sẽ hoạt động tốt, vì vậy bạn nhận được chấp nhận. ;) – DevZarak

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