Я вижу, что все анимации ios в моем приложении перестают работать. Это происходит очень часто в iOS7.
Привет, ребята, у меня было приложение, поддерживающее iOS 5, 6 и 7. Недавно я вижу, что все анимации iOS перестают работать в приложении в iOS7??
Я вижу, что все анимации ios в моем приложении перестают работать. Это происходит очень часто в iOS7.
Привет, ребята, у меня было приложение, поддерживающее iOS 5, 6 и 7. Недавно я вижу, что все анимации iOS перестают работать в приложении в iOS7??
В IOS 7, когда какое-то действие основного метода выполняется в фоновом потоке, анимация отключается.
поэтому для этого вам нужно снова включить анимацию, как (обходной путь)
[UIView setAnimationsEnabled:YES];
Может быть, это может помочь.
Недавно я столкнулся с этой проблемой с некоторыми представлениями, которые я собираю для расчета размера в фоновом потоке. По 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
или просто придерживаясь точки останова в теле функции.
Расширение решения Vinay, что я делаю:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//make calculations
dispatch_async(dispatch_get_main_queue(),
^{
[UIView setAnimationsEnabled:YES];
});
});
Кажется, проблема решена.