2009-02-05 9 views
33

Tôi đang cố gắng xây dựng một CABasicAnimation để tạo hiệu ứng cho thuộc tính backgroundColor của Core Animation CALayer, nhưng tôi không thể tìm ra cách để bọc đúng giá trị CGColorRef để truyền cho hoạt ảnh. Ví dụ:Làm thế nào để bạn tạo hiệu ứng một cách rõ ràng backgroundColor của CALayer?

CGColorSpaceRef rgbColorspace = CGColorSpaceCreateDeviceRGB(); 
CGFloat values[4] = {1.0, 0.0, 0.0, 1.0}; 
CGColorRef red = CGColorCreate(rgbColorspace, values); 
CGColorSpaceRelease(rgbColorspace); 

CABasicAnimation *selectionAnimation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"]; 
[selectionAnimation setDuration:0.5f]; 
[selectionAnimation setToValue:[NSValue valueWithPointer:red]]; 
[layer addAnimation:selectionAnimation forKey:@"selectionAnimation"]; 

dường như không làm gì với thuộc tính backgroundColor, tôi giả định vì việc chuyển nó thành con trỏ được bao bọc trong NSValue không phải là cách để truyền nó.

backgroundColor là một thuộc tính có thể hoạt hình của CALayer, vì vậy câu hỏi của tôi là: làm cách nào để đặt giá trị Từ hoặc Tới cho thuộc tính cụ thể này (tốt nhất là theo cách độc lập với nền tảng Mac/iPhone)?

Trả lời

57

Bạn không cần phải bọc CGColorRef s khi đặt các thuộc tính toValue hoặc fromValue thuộc tính CABasicAnimation. Chỉ cần sử dụng CGColorRef. Để tránh cảnh báo trình biên dịch, bạn có thể truyền CGColorRef đến id.

Trong ứng dụng mẫu của tôi, đoạn mã sau hoạt ảnh nền sang màu đỏ.

CABasicAnimation* selectionAnimation = [CABasicAnimation 
    animationWithKeyPath:@"backgroundColor"]; 
selectionAnimation.toValue = (id)[UIColor redColor].CGColor; 
[self.view.layer addAnimation:selectionAnimation 
         forKey:@"selectionAnimation"]; 

Tuy nhiên, khi hoạt ảnh kết thúc, nền sẽ trở về màu gốc. Điều này là do CABasicAnimation chỉ ảnh hưởng đến lớp trình bày của lớp đích trong khi hoạt ảnh đang chạy. Sau khi hoạt ảnh kết thúc, giá trị được đặt trong lớp mô hình sẽ trả về. Vì vậy, bạn sẽ phải thiết lập các lớp backgroundColor tài sản màu đỏ là tốt. Có lẽ tắt hoạt ảnh ngầm bằng cách sử dụng CATransaction.

Bạn có thể tự khắc phục sự cố này bằng cách sử dụng hoạt ảnh ngầm ở nơi đầu tiên.

+13

Ngọt ngào. Bạn sẽ nghĩ rằng họ sẽ ghi lại bản định kiểu cho id ở đâu đó. Có, tôi có thể làm cho cuộc sống của tôi dễ dàng hơn với một hoạt hình ngầm, nhưng điều này đã làm tôi thất vọng. Để thực hiện điều này, tất cả những gì bạn cần là đặt fillMode của hoạt ảnh thành kCAFillModeForwards và xóaOnCompletion thành NO. –

+0

+1 Đẹp, hoạt động như một sự quyến rũ! –

+0

Hoặc bạn có thể tiết kiệm cho mình rất nhiều thời gian và sử dụng thư viện Facebook Pop: https://github.com/facebook/pop. Ví dụ ở đây: https://github.com/maxmyers/FacebookPop – Benjamin

2

Tôi đã đấu tranh với vấn đề này cho đến khi tôi thử nghiệm tìm thấy rào cản. Thiết lập thuộc tính backgroundColor của layer, trực tiếp hoặc thông qua animation, sẽ không có tác dụng nếu bạn thay đổi màu nền từ mặc định (không xác định) trong Interface Builder, trong bối cảnh của một item (như UILabel) được đặt trong IB. Vì vậy, để lại màu nền không xác định và ở trên sẽ làm việc.