2012-10-18 34 views
5

Core Animation'ı öğreniyorum ve örnek örneklerini deniyorum. Aşağıdaki kodu kullandığınızda bunu hiçbir tuşa basmadan olur böylece viewDidLoad düğmesinin altındaki Animasyon yöntemi kodunu yığılı eğerCATransaction ayarı animasyon süresi çalışmıyor

, animasyon süresi, Öte yandan

@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 

işleri animasyon süresine uyulmaz. Sadece son sonucu herhangi bir animasyon olmadan görüyorum.

Herhangi bir düşünce?

Teşekkür KMB

cevap

16

Burada eksik bilgi bu: uygulamanızda iki katman hiyerarşi bulunmaz. Normalde üzerinde çalıştığınız model katman hiyerarşisi var. Sonra ekranda neler olduğunu yansıtan sunumu katman hiyerarşisi var. Biraz fazla bilgi için “Layer Trees Reflect Different Aspects of the Animation State” in the Core Animation Programming Guide bir göz atın, ya da (yüksek önerilir) WWDC 2011 dan Core Animation Essentials videoyu izleyin.

Yazdığınız tüm kodlar model katmanında çalışır (gerektiği gibi).

sistem kapalı animasyonlar ekler gelen sunum katmanı için bir model tabakası kopyalar değiştirilmiş bir canlandırılabilir özellik değeri. Bir UIWindow 'ın görünümü hiyerarşi içindedir

Sadece modeli katmanları sunum katmanları olsun. Sistem, self.view penceresini eklemeden önce size viewDidLoad gönderir, böylece için hiçbir sunum katmanı veya viewDidLoad çalışırken özel katmanınız yoktur. görünüm ve katman penceresine eklenmiş ve sistem sunum katmanları yarattı sonra

Yani yapmanız gereken tek şey, sonradan özelliğini değiştirmek olduğunu. viewDidAppear: yeterince geç kaldı.

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

teşekkürler Rob. İşe yaradı. Etrafımdaki bu parantezlerin isteğe bağlı olduğunu tahmin ediyorum. – Spectravideo328

+0

Parantez isteğe bağlıdır. 'Begin' ve 'commit' arasındaki kodu girmeyi severim ve parantez Xcode'u otomatik olarak girintilendirir. –

+0

Başvurulan WWDC videosunu ikinci kez çalıştırıyorum - bu, CoreAnimation'ın çok sayıda toplama aşamasına mükemmel bir giriş niteliğindedir. – MaxGabriel