IOS анимации перестают работать в моем приложении в iOS7

Я вижу, что все анимации ios в моем приложении перестают работать. Это происходит очень часто в iOS7.

Привет, ребята, у меня было приложение, поддерживающее iOS 5, 6 и 7. Недавно я вижу, что все анимации iOS перестают работать в приложении в iOS7??

Ответ 1

В IOS 7, когда какое-то действие основного метода выполняется в фоновом потоке, анимация отключается.

поэтому для этого вам нужно снова включить анимацию, как (обходной путь)

[UIView setAnimationsEnabled:YES];

Может быть, это может помочь.

Ответ 2

Недавно я столкнулся с этой проблемой с некоторыми представлениями, которые я собираю для расчета размера в фоновом потоке. По swizzling setAnimationsEnabled: я обнаружил, что время только, которое я отключил анимацию из фонового потока, находилось в -[UIImageView setImage:].

Поскольку это представление никогда не отображалось, и изменения изображения не были необходимы для моего расчета, я смог заключить этот тест в вызов основного потока:

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

Стоит отметить, что я не сталкиваюсь с этой проблемой при создании исходного представления, потому что я уже загружаю свои шаблонные представления в основной поток, чтобы избежать проблемы с загрузкой Xib.

Другие проблемы могут быть более сложными, но вы должны иметь возможность использовать аналогичные обходные пути. Здесь категория, которую я использую для обнаружения фонового отключения анимаций.

#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

Обновление

Оказывается, что UIWebView фактически вызывает небезопасные вызовы setAnimationsEnabled: при отображении медиа-элемента (rdar://20314684). Это делает вышеупомянутый метод очень болезненным, чтобы иметь активную все время, если ваше приложение позволяет произвольный веб-контент. Вместо этого я начал использовать метод ниже, поскольку он позволяет включать и выключать точку останова и продолжать работу после сбоя:

#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

С помощью этого кода вы можете остановить свое приложение, добавив символическую точку останова на SEViewAlertForUnsafeBackgroundCalls или просто придерживаясь точки останова в теле функции.

Gist

Ответ 3

Расширение решения Vinay, что я делаю:

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

Кажется, проблема решена.