2012-10-18 30 views
5

Tôi đang học Hoạt ảnh chính và thử các ví dụ mẫu.Thời lượng hoạt ảnh của thiết lập giao dịch không hoạt động

Khi tôi sử dụng đoạn mã sau, trong suốt thời gian hoạt hình làm việc

@implementation ViewController 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

//Modifying base layer 
self.view.layer.backgroundColor = [UIColor orangeColor].CGColor; 
self.view.layer.cornerRadius = 20.0; 
self.view.layer.frame = CGRectInset(self.view.layer.frame, 20, 20); 

//Adding layer 
mylayer=[CALayer layer]; //mylayer declared in .h file 
mylayer.bounds=CGRectMake(0, 0, 100, 100); 
mylayer.position=CGPointMake(100, 100); //In parent coordinate 
mylayer.backgroundColor=[UIColor redColor].CGColor; 
mylayer.contents=(id) [UIImage imageNamed:@"glasses"].CGImage; 

[self.view.layer addSublayer:mylayer]; 
} 


- (IBAction)Animate //Simple UIButton 
{ 
[CATransaction begin]; 

// change the animation duration to 2 seconds 
[CATransaction setValue:[NSNumber numberWithFloat:2.0f] forKey:kCATransactionAnimationDuration]; 

mylayer.position=CGPointMake(200.0,200.0); 
mylayer.zPosition=50.0; 
mylayer.opacity=0.5; 

[CATransaction commit]; 
} 
@end 

Mặt khác, nếu tôi đã kết hợp các phương pháp mã Animate ở dưới cùng của nút viewDidLoad để nó xảy ra mà không cần nhấn bất kỳ nút, thời lượng hoạt ảnh không được tôn trọng. Tôi chỉ thấy kết quả cuối cùng mà không có bất kỳ hoạt ảnh nào.

Mọi suy nghĩ?

Cảm ơn KMB

Trả lời

16

Dưới đây là thông tin mà bạn đang thiếu: có hai phân cấp lớp trong ứng dụng của bạn. Có phân cấp lớp mô hình mà bạn thường hoạt động. Sau đó, có phân cấp lớp bản trình bày, phản ánh nội dung trên màn hình. Hãy xem “Layer Trees Reflect Different Aspects of the Animation State” in the Core Animation Programming Guide để biết thêm thông tin một chút hoặc (được khuyến nghị cao) xem video Hoạt hình cốt lõi của video từ WWDC 2011.

Tất cả mã bạn đã viết hoạt động trên lớp mô hình (vì nó nên).

Hệ thống thêm hoạt ảnh ngầm khi nó sao chép giá trị thuộc tính có thể thay đổi được thay đổi từ lớp mô hình sang lớp bản trình bày tương ứng.

Chỉ các lớp mô hình nằm trong phân cấp chế độ xem của UIWindow mới có các lớp trình bày. Hệ thống sẽ gửi cho bạn viewDidLoad trước khi nó thêm self.view vào cửa sổ, do đó, không có lớp bản trình bày nào cho self.view hoặc lớp tùy chỉnh của bạn chưa khi viewDidLoad đang chạy.

Vì vậy, một điều bạn cần làm là thay đổi thuộc tính sau này, sau khi xem và lớp đã được thêm vào cửa sổ và hệ thống đã tạo các lớp trình bày. viewDidAppear: đủ trễ.

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    //Modifying base layer 
    self.view.layer.backgroundColor = [UIColor orangeColor].CGColor; 
    self.view.layer.cornerRadius = 20.0; 
    self.view.layer.frame = CGRectInset(self.view.layer.frame, 20, 20); 

    // Adding layer 
    mylayer = [CALayer layer]; //mylayer declared in .h file 
    mylayer.bounds = CGRectMake(0, 0, 100, 100); 
    mylayer.position = CGPointMake(100, 100); //In parent coordinate 
    mylayer.backgroundColor = [UIColor redColor].CGColor; 
    mylayer.contents = (id)[UIImage imageNamed:@"glasses"].CGImage;  
    [self.view.layer addSublayer:mylayer]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    [CATransaction begin]; { 
     [CATransaction setAnimationDuration:2]; 
     mylayer.position=CGPointMake(200.0,200.0); 
     mylayer.zPosition=50.0; 
     mylayer.opacity=0.5; 
    } [CATransaction commit]; 
} 
+0

Cảm ơn Rob. Điều đó hiệu quả. Tôi đoán những dấu ngoặc xung quanh bắt đầu cam kết là tùy chọn. – Spectravideo328

+0

Niềng răng là tùy chọn. Tôi muốn thụt lề mã giữa 'bắt đầu' và' commit', và các dấu ngoặc ôm làm cho Xcode tự động thụt lề nó. –

+0

Tôi mạnh mẽ thứ hai tham chiếu WWDC video - đó là một giới thiệu tuyệt vời cho nhiều gotchas của CoreAnimation. – MaxGabriel

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