2010-07-13 24 views
36

Arabirimdeki düğmeleri ayırmak için aşağıdaki iki yöntemi bağladım, ancak yöntem içinde animasyon süresi bitene kadar düğmeye basamadığım "VERSION 1" düğmesine bastığımda fark ettim. Anlayışım, animasyonun ana uygulamayı engellememek için kendi iş parçacığını kullanmasıydı.animateWithDuration: animasyonlar: ana parçacığı engelle?

// VERSION 1 
-(IBAction)fadeUsingBlock { 
    NSLog(@"V1: Clicked ..."); 
    [myLabel setAlpha:1.0]; 
    [UIView animateWithDuration:1.5 animations:^{ 
     [myLabel setAlpha:0.0]; 
    }]; 
} 

eski stil sürümü (aşağıda) animasyon zamanlayıcısı basitçe yeniden başlamak zamanlayıcı sıfırlanır, sona ermeden önce düğmeye bastırılmış izin yok. Bunların ikisi de aynı şekilde çalışıyor mu, bir şey mi eksik veya 3.2 ile 4 arasında bir operasyon değişikliği oldu mu?

// VERSION 2 
-(IBAction)fadeUsingOld { 
    NSLog(@"V2: Clicked ..."); 
    [myLabel setAlpha:1.0]; 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1.5]; 
    [myLabel setAlpha:0.0]; 
    [UIView commitAnimations]; 
} 

Alkış gary

cevap

86

Bloklarla animasyon yapmak, ana parçacığı engellemez. Gördüğünüz davranışın, varsayılan olarak, kullanıcı etkileşimi yeni blok çağrıları ile devre dışı bırakılmış animasyon olduğundan dolayı olduğunu düşünüyorum. Bunu, (animationWithDuration:delay:options:animations:completion çağırarak) UIViewAnimationOptionAllowUserInteraction geçirerek bu geçersiz kılabilirsiniz: mantıklı

-(IBAction) fadeUsingBlock { 
    NSLog(@"V1: Clicked ..."); 
    [myLabel setAlpha:1.0]; 
    [UIView animateWithDuration:1.5 
          delay:0 
         options:UIViewAnimationOptionAllowUserInteraction 
        animations:^{ 
         [myLabel setAlpha:0.0]; 
        } 
        completion:nil]; 
} 
+2

Ah, docs bu seçeneği kaçırmıştı, ben onu bakacağız. Çok teşekkürler, çok takdir ediyorum. – fuzzygoat

+1

Bunun için teşekkürler. Kahretsin, bu beni rahatsız ediyordu. Aslında varsayılan olarak açık değildir, çünkü animasyonun görüntülenmesiyle etkileşimi engeller, ancak aslında tüm kullanıcı arayüzünü engeller! – runmad

+0

Adam, yakında iOS 5.0 ... 'da düzeltildiyse bu hoş olmaz mıydı? –

1

animateWithDuration için :, sınıf referans parçacığı hakkında hiçbir şey söylemez, bu yüzden emin değilim.

beginAnimations:context: and commitAnimation: için, evet, ayrı bir iş parçacığı UIView class Reference içinde çalışırlar.

Nesnelerin görüntülenmesi için özellik değişikliklerinden bazıları animasyonlu olabilir - örneğin çerçeveyi, sınırları, ortayı ve dönüştürme özelliklerini ayarlama. Bu özellikleri bir animasyon bloğunda değiştirirseniz, mevcut durumdan yeni duruma yapılan değişiklikler canlandırılır. BeginAnimations'ı çağırın: context: bir animasyon bloğu başlatmak için sınıf yöntemi, animasyonunu istediğiniz özellikleri ayarlayın ve ardından bir animasyon bloğunu sonlandırmak için commitAnimations sınıfı yöntemini çağırın. Animasyonlar ayrı bir iş parçacığında çalıştırılır ve uygulamanın çalışma döngüsüne döndüğünde başlar. Diğer animasyon sınıfı yöntemleri, blok içindeki animasyonların başlangıç ​​zamanını, süresini, gecikmesini ve eğrisini kontrol etmenizi sağlar.

İlgili konular