私のアプリのすべてのiOSアニメーションが動作を停止しているのを見ています.iOS7では非常に頻繁に起こっています。iOSのアニメーションがiOS7のアプリケーションで動作しなくなる
ちょっと私は、iOS 5,6,7をサポートしているアプリを持っていました。最近、すべてのiOSアニメーションがiOS7のアプリで動作しなくなっています。
私のアプリのすべてのiOSアニメーションが動作を停止しているのを見ています.iOS7では非常に頻繁に起こっています。iOSのアニメーションがiOS7のアプリケーションで動作しなくなる
ちょっと私は、iOS 5,6,7をサポートしているアプリを持っていました。最近、すべてのiOSアニメーションがiOS7のアプリで動作しなくなっています。
IOS 7では、バックグラウンドスレッドでメインメソッドの処理が実行されると、アニメーションが無効になります。
ので、このために、あなたはこれを助けることができるかもしれませ
[UIView setAnimationsEnabled:YES];
(回避策)のようなアニメーションを再度有効にする必要があります。ビナイのソリューションを拡張
これは回避策ですが、私はそれを正しくマークしています。バックグラウンドスレッドではメインメソッドアクションを実行しないでください。 – user1010819
これは単なる回避策であることに同意します。 –
は、それは私が何をすべきかです:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//make calculations
dispatch_async(dispatch_get_main_queue(),
^{
[UIView setAnimationsEnabled:YES];
});
});
問題を解決するようです。
私はバックグラウンドスレッドでサイズ計算のためにレイアウトしているいくつかのビューで最近この問題に遭遇しました。スウィズルで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
更新
それはメディア要素(rdar:// 20314684)を表示するときUIWebView
が実際にsetAnimationsEnabled:
に危険な呼び出しを行うことが判明しました。これにより、あなたのアプリが任意のWebコンテンツを許可している場合、上記の方法は常に痛いものになります。それは私が上でブレークポイントをオンとオフと故障後も継続することができますその代わりに、私は以下の方法を使用して開始しました:このコードで
#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
にシンボリックブレークポイントを追加したり、単に貼り付けることで、あなたのアプリを停止することができます関数本体のブレークポイント。
この回答は素晴らしいです。そのアサーションがスローされるたびに、あなたはあなたのソースコードで、あなたが混乱していて、メインスレッドではない何かをしようとしたことがわかります。 –
setAnimationsEnabled:への安全でない呼び出しを作成し続けているwebviewのために、この動作が発生していました。他のビューがアニメーション化されて競合状態に陥ってしまいました。 このwebviewナンセンスを修正する方法はありますか? WKWebViewの採用はオプションではありません.WebViewはサードパーティのクラスにカプセル化されているからです。 setAnimationsEnabledを常時スウィズルしていますか?強制的にメインで実行するのは危険ですか? – ArkReversed
私はその背後にある理由を知りませんが、私はまったく同じ問題があったと私は取り外したときに、それが解決されたのtableView:willDisplayCell:forRowAtIndexPath:画像を表示するperformSelectorInBackgroundの多くを呼び出すために使用される方法。これは、問題を解決するのに役立つかもしれないし、何らかのヒントを与えるかもしれない。 – Mohammad
私は実際に見つけました。あなたがバックグラウンドスレッドでUIKitのことをするときに起こります。すべてのことを説明するリンクがあります。 http://stackoverflow.com/questions/18281097/uiviewcontroller-animations-stop-working – user1010819