3

カスタム uitableviewcell のプロパティとして追加した、本当に単純なプレーヤー クラスを作成しました。スクロールにはかなり満足していましたが、もっと良くなると思いました。プレーヤー クラス内から呼び出して、プレーヤーを再利用する準備を整える「クリーンアップ」メソッドがあります。

-(void)URLFromWeb:(NSURL*)URL{


    [self cleanPlayer];



    AVAsset* avAsset = [AVAsset assetWithURL:URL];
    AVPlayerItem *playerItem =[[AVPlayerItem alloc]initWithAsset:avAsset];

    if (!self.player) {

        self.player = [AVPlayer playerWithPlayerItem:playerItem];
        [self.player setActionAtItemEnd:AVPlayerActionAtItemEndNone];

    }

    if (!self.avPlayerLayer) {


        self.avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
        self.avPlayerView = [[UIView alloc] initWithFrame:CGRectZero];
        [self.avPlayerView.layer addSublayer:self.avPlayerLayer];

        [self addSubview:self.avPlayerView];

        [self.avPlayerLayer setFrame:CGRectMake(0, 0, 320, 320)];

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(playerPlayedToEnd:)
                                                     name:AVPlayerItemDidPlayToEndTimeNotification
                                                   object:nil];
    }

    [self.avPlayerView removeFromSuperview];
    [self addSubview:self.avPlayerView];

}

これが「cleanPlayer」のコードです

    -(void)cleanPlayer{

   [self.avPlayerView removeFromSuperview];

    self.avPlayerView = nil;
    self.avPlayerLayer = nil;
    self.player = nil;


}

[self.avPlayerView removeFromSuperview]行を cleanPlayer メソッドから削除すると、スクロールは素晴らしいものになりますが、かなりの回数スクロールした後、セルはビデオの再生を停止し、間違ったビデオがセルに表示され始めます。コードを追加し直すと、セルが作成されるたびにわずかな「しゃっくり」が発生し、少し面倒です。何が起こっているのかについての洞察は大歓迎です。ああ、私はプロファイラーを使用しましたが、原因を特定するのに役立つものは何も見つかりませんでした. 前もって感謝します!

4

1 に答える 1

1

プレーヤーとそのレイヤーを毎回クリアする必要はないと思います。

プレーヤーとそのレイヤーをインスタンス化して、必要なときにUITableViewCell.awakeFromNib()呼び出すだけです。AVPlayer.replaceCurrentItemWithPlayerItem(newItem)

UITableView.cellForRowAtIndexPath(indexPath)たとえば、それを行うことができます。を追加することもできAVPlayer.replaceCurrentItemWithPlayerItem(nil)ますUITableViewCell.prepareForReuse()

少しトリッキーに思えるかもしれませんが、ここでは何も削除する必要はありません ;)

これが役立つことを願っています!

于 2015-07-20T09:06:48.007 に答える