2013-10-16 29 views
11

uygulamasında çalışmama son veriliyor Uygulamamdaki tüm ios animasyonların çalışmayı durdurduğunu görüyorum. IOS7'de çok sık oluyor.iOS animasyonları iOS7

Merhaba çocuklar iOS 5, 6 ve 7'yi destekleyen bir uygulama yaşadım. Son zamanlarda tüm iOS animasyonlarının iOS7 uygulamasında çalışmayı durdurduğunu görüyorum ??

+0

Bunun arkasında nedenini bilmiyorum ama ben tam aynı sorunu vardı ve kaldırıldı zaman çözüldü bir tableView: willDisplayCell: forRowAtIndexPath: resimleri görüntülemek için performSelectorInBackground sürü çağırmak için kullanılan yöntem. Bu, sorunu çözmek için bazı ipuçları verebilir veya verebilir. – Mohammad

+0

Aslında öğrendim.Bu arka planda thread UIKit şeyler yaptığınızda olur.Here her şeyi açıklar bağlantıdır. http://stackoverflow.com/questions/18281097/uiviewcontroller-animations-stop-working – user1010819

cevap

24

IOS 7'de arka plan iş parçacığı üzerinde bazı ana yöntem eylemleri gerçekleştirildiğinde, animasyonlar devre dışı bırakılır.

yüzden bunun için bu yardımcı olabilir olabilir

[UIView setAnimationsEnabled:YES]; 

(A geçici çözüm) gibi animasyonlar yeniden etkinleştirmek gerekiyor.

+3

Bu bir çalışma olmasına rağmen, doğru olarak işaretliyorum.Arka plan iş parçacığında hiçbir ana yöntem eylemi yapılmamalıdır. – user1010819

+2

Bunun sadece bir çalışma olduğunu kabul ediyorum. –

1

VINAY en çözümünü genişletme, o benim işim:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      //make calculations 
      dispatch_async(dispatch_get_main_queue(), 
          ^{ 
           [UIView setAnimationsEnabled:YES]; 
          });   
}); 

sorunu çözmek gibi görünüyor.

+0

Bu, beklediğim en kötü yanıt: D – l0gg3r

+0

mükemmel değil, ancak –

+0

çalışır, dış gönderi ne için eşzamansız? Onu kaldıramaz mısın? – AntiMoron

16

Bazı sorunlar nedeniyle arka plan iş parçacığı üzerinde boyut hesaplamaları için döşeme yapıyorum, bu sorunla karşılaştım. setAnimationsEnabled: swizzling tarafından -[UIImageView setImage:]sadece arka plan iş parçacığı animasyonları devre dışı bırakma olduğunu bulundu.

if ([NSThread isMainThread]) { 
    self.answerImageView.image = [UIImage imageNamed:imgName]; 
} 

Bu kayda değer ben bu basmayın: Bu görünüm render asla ve görüntü değişiklikleri benim hesaplanması için gerekli değildi çünkü

, bir ana iş parçacığı çağrısında bu testi içine başardı İlk görünüm örneğinde sorun çünkü bir Xib yükleme sorununu önlemek için şablon görünümlerimi ana iş parçacığına zaten yüklüyorum.

Diğer sorunlar daha karmaşık olabilir, ancak benzer çözümler bulabilmeniz gerekir. Animasyonların arka planını devre dışı bıraktığını tespit etmek için kullandığım kategori.

#import <UIKit/UIKit.h> 
#import <JRSwizzle/JRSwizzle.h> 

#ifdef DEBUG 

@implementation UIView (BadBackgroundBehavior) 

+ (void)load 
{ 
    NSError *error = nil; 
    if (![self jr_swizzleClassMethod:@selector(setAnimationsEnabled:) withClassMethod:@selector(SE_setAnimationsEnabled:) error:&error]) { 
     NSLog(@"Error! %@", error); 
    } 
} 

+ (void)SE_setAnimationsEnabled:(BOOL)enabled 
{ 
    NSAssert([NSThread isMainThread], @"This method is not thread safe. Look at the backtrace and decide if you really need to be doing this here."); 
    [self SE_setAnimationsEnabled:enabled]; 
} 

@end 

#endif 

Güncelleme

Bir medya elemanını (: // 20314684 rdar) görüntülerken UIWebView aslında setAnimationsEnabled: için güvensiz çağrı yapar çıkıyor. Bu, uygulamanızın keyfi web içeriğine izin veriyorsa, yukarıdaki yöntemin her zaman aktif olmasını çok acı verici hale getirir. , Sen SEViewAlertForUnsafeBackgroundCalls üzerinde sembolik bir kesme noktası ekleyerek veya sadece öbürünün uygulamanızı durdurabilirsiniz

#import <UIKit/UIKit.h> 
#import <objc/runtime.h> 

#ifdef DEBUG 

void SEViewAlertForUnsafeBackgroundCalls() { 
    NSLog(@"----------------------------------------------------------------------------------"); 
    NSLog(@"Background call to setAnimationsEnabled: detected. This method is not thread safe."); 
    NSLog(@"Set a breakpoint at SEUIViewDidSetAnimationsOffMainThread to inspect this call."); 
    NSLog(@"----------------------------------------------------------------------------------"); 
} 

@implementation UIView (BadBackgroundBehavior) 

+ (void)load 
{ 
    method_exchangeImplementations(class_getInstanceMethod(object_getClass(self), @selector(setAnimationsEnabled:)), 
            class_getInstanceMethod(object_getClass(self), @selector(SE_setAnimationsEnabled:))); 
} 

+ (void)SE_setAnimationsEnabled:(BOOL)enabled 
{ 
    if (![NSThread isMainThread]) { 
     SEViewAlertForUnsafeBackgroundCalls(); 
    } 
    [self SE_setAnimationsEnabled:enabled]; 
} 

@end 

#endif 

Bu kod ile: Bunun yerine bu beni üzerinde kesme noktası açmak ve kapatmak ve başarısızlık sonra devam edelim aşağıda yöntemini kullanmaya başladıktan işlev gövdesinde bir kesme noktası.

Gist

+0

Bu cevap muhteşem. Bu iddia ne zaman atılırsa, kaynak kodunuzda berbat olduğunuzu göreceksiniz ve ana iş parçasında olmayan bir şeyi yapmaya çalışın. –

+0

Bu davranışı, setAnimationsEnabled için güvensiz aramalar yapmaya devam eden bir web görünümünden dolayı yaşıyordum ve diğer görüntülerle animasyon yaparken yarış koşullarına koşuyordum. Bu web görüntüsünü anlamsızlaştırmanın bir yolu var mı? WKWebView'ın benimsenmesi bir seçenek değildir çünkü web görünümü üçüncü taraf bir sınıfta kapsüllenir. SetAnimationsEnabled: sürekli olarak ana makinede çalışmaya zorlamak için çok tehlikeli olabilir mi? – ArkReversed

İlgili konular