2013-08-16 8 views
20

私のアプリケーションはiOS6ではうまく動作しますが、NDAの理由で名前を付けることができない予定されていないiOSのバージョンでは、すべてUIViewControllerのアニメーションが機能しなくなります。新しいビューはただちにポップアップして表示されます。この不特定のiOSの将来のバージョンが原因であるかどうかはわかりませんが、これはiOS6で時々起こることがわかりました。UIViewControllerのアニメーションが動作を停止します

時にはアニメーションがしばらくの間動作し、その後すぐに停止して、何らかのメモリ警告の問題だと思うようになることがありますが、私のアプリではたいていかなりの125MBのRAMを使います。調査するためのアドバイスやものは誰でも提供できますか?

+0

をより多くの情報はここに有用であろう。あなたはどのようにアニメーション化していますか?関連するコードを投稿できますか?それ以外の場合は、Apple Devフォーラムでもっと幸運を祈るかもしれません。 –

+0

私は絶対的に[self.navigationController pushViewController:viewController animated:YES]スタイルのビューコントローラのトランジションを行っています。悲しいことに、アップルのdevフォーラムは私の経験ではSOと比べると少し荒れていますが、そこにはスレッドもあります。 –

+0

あなたはUIViewControllerのカスタムサブクラスをまったく使用していませんか?在庫部品だけ?私は、記憶の圧力のために停止しているアニメーションについて聞いたことがありません。それは起こりそうもない。 – Jeff

答えて

39

説明されている動作は常に存在しています。バックグラウンドスレッドで作業してからUIKitメソッドを呼び出すと、更新が奇妙な方法で遅れることがよくあります。

このため、UIを更新するには、メインキューに常にdispatch_asyncを設定する必要があります。

これらのバグは、必ずしも予想通りに発生するとは限りません。

私はそれらを捕まえるために、いくつかのUIKitメソッドをスウィズルして、メインスレッドで呼び出されているかどうかをチェックするメソッドを作成しました。これにより、メインキューに戻すのを忘れてしまったときに、シンボリックなブレークポイントを止めることができます。

https://github.com/Cocoanetics/DTFoundation/blob/develop/Core/Source/iOS/Debug/UIView%2BDTDebug.m

+0

そのコードは、バックグラウンドスレッドのものを見つけた方法です。 –

+0

iHunterのソースから、DTObjectBlockExecutor、NSObject + DTRuntime、およびUIView + DTDebugが必要です。ビューメソッドをすっきりさせて問題をキャッチします。 –

+0

うわー!!どうもありがとう!!驚くばかり!!! Cocoaneticsあなたはロック! – user1010819

14

この問題に関するアップルのdevのフォーラムから良い回避策:

[UIView setAnimationsEnabled:YES] 

やアニメーション、再び作業を開始:

はこれを行います。私はこれがまっすぐなiOS7のバグだと思うか、私のコードのどこかにアニメーションがあるとか、UIViewControllerの起動がバックグラウンドスレッドで起こっているためにアニメーションが停止することが考えられます。おそらく未定のiOSの将来のバージョンとは関係ありません。

+0

Fyi、私たちのアプリのビューのアニメーションは、ok、fyiで動作するようです。また、質問に1つ追加しました。それは良い質問だと思った。 – ort11

+1

あなたはなぜ回答として投稿していますか?あまりにも2つの答え?これを編集した後で問題にしてください... –

0

この問題は、バックグラウンドスレッドでUIKitを実行することによって発生しているようです。複雑なUIViewをUIImagesにレンダリングして出力をキャッシュするNSOperationsで完全なレンダリング前のキャッシュがあります。これはiOS6では問題なく動作していたようですが、おそらくやや線を横切っています。この機能を、UIViewsやUILabelsをまったく使用するのではなく、画像やテキストをグラフィックスバッファにレンダリングするものに置き換える必要があります。

0

API.Iosからの応答を受信した上でUIを更新するUIを更新するため、デフォルトではメインキューを使用していますが、それはあなたが持っている100%のefficient.Henceではありませんしながら、あなたがしなければならないのは、メインキューのキャッチホールドですUIは、メインスレッドだけとそれを行うための方法で更新されることを確認することは以下の通りです:

DispatchQueue.main.async{ 
    //UI related code eg: 
    self.label.text = "abc" 
    self.button.setTitle("xyz",.normal) 
    self.tableView.reloadData() 
} 

あなたがメインスレッドアニメーションのホールドをキャッチされていない場合は、または動作しない場合があります。 しかし、メインスレッドのアニメーションを使用している場合は、間違いなく動作します。

正しいコードAPIレスポンスにUIを更新中:アニメーションが停止し、奇妙なクラッシュにつながる可能性があり

Alamofire.getApiCall(paramaters: parameters, completion:{ 
    response in 
    // UI related code. 
    DispatchQueue.main.async{ 
    self.label.text = "abc" 
    self.button.setTitle("xyz",.normal) 
    self.tableView.reloadData() 
    } 
}) 

不正なコード:

Alamofire.getApiCall(paramaters: parameters, completion:{ 
    response in 
    // UI related code. 
    self.label.text = "abc" 
    self.button.setTitle("xyz",.normal) 
    self.tableView.reloadData() 
}) 
関連する問題