uicollectionViewCellでスクロールすると、MpMoviePlayerControllerが空白になります
-
21-12-2019 - |
質問
私のUICollectionViewには水平フローレイアウトがあります。各セルは画面全体を取り、ページングがオンになっています。各セルにはMpMoviePlayerControllerも含まれており、問題なくビデオを再生することができます。ただし、現在表示されているムービー(この時点で一時停止している)が消えます - プレーヤーのビューが黒になるとわかります。その後、再生をトリガーすると、ビデオが再び表示されます。私はScrollView DelegateメソッドでMepeletoplayを追加しようとしました。
解決
MPMoviePlayerController
のインスタンスを1回だけ使用できます。これはMPMoviePlayerController
の制限です。
あなたの場合は、スクロールを開始すると、少なくとも2つのMPMoviePlayerController
を初期化してビデオを再生しようとしています。これはMPMoviePlayerController
では不可能です。
同じ画面に一度に複数のビデオをプレイしたい場合は、これにAVFoundation
を使用することを検討してください。AVFoundation
に基づいてオープンソースのビデオプレーヤーがあります。USINE 1つは、最初からAVFoundation
プレーヤーを作成するよりも簡単になります。
他のヒント
コレクションビューをスクロールすると、視覚外のセルがコレクションビュー "再利用可能なプール"メカニズムによって再利用されるため、既存のムービープレーヤーが削除され、そのステータスがリセットされます。セルビューが再度表示されると、ビューがプールから取得されます(またはプールが空の場合は新しいものが作成された場合)、それを再設定する必要があります。 そのような状況で何ができること:
- 簡単な解決策:すべての単一のコレクションビューセルに一意の識別子(例えば、セルインデックスパス座標を使用)されているため、リサイクルされません。このアプローチを描く:すべての新しいセルがスクラッチから再作成されるにつれて、メモリの問題が発生する可能性があります。そして、ムービープレーヤーコントローラは無視できないメモリ を取ります
- より複雑な解決策:すべてのシングルムービープレーヤーのステータスを追跡します(再生時間、ビデオURL、...そのパラメータを監視することやその通知を聞くことによってこれを行うことができます)。 。セルが見えなくなると、ムービープレーヤーがリセットされますが、再循環されている場合は、ムービープレーヤーのステータスを正しい位置に再設定できます。明らかに操作は即時ではありません(ムービープレーヤーはビデオのレンダリングに時間がかかります)、あなたはあなたのアプリに余分なメモリ圧力を追加しません。