2016-03-30 11 views
0

私は奇妙な問題があります。私はテーブルビューを持っており、セルにはビデオが含まれています。 AVPlayerLayerをセルのサイズに合わせて設定しますが、最初に読み込んだときは最初の2つのセルだけではありません。セル3 +は正しくロードされ、テーブルビューを下から上にスクロールすると、セルは最初の2に正しくロードされます。私は13秒のYouTubeビデオを作成して、私の意味を正確に示しました。ビデオの最初の数秒間に最初の2つのセルの下部にある空白に注目してください。バックアップをスクロールすると、その領域は存在しません。AVPlayerLayerの境界は正しいです。ここでAVPlayerLayerは境界変更時にのみ正しく設定されます

https://www.youtube.com/watch?v=q7BlZd77QVU

のtableViewセルを設定し、私のコードはcellForRowAtIndexPathで、次のとおりです。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    NSString *mov = @".mov"; 
    NSString *fullComponent = [NSString stringWithFormat: @"%@%@", self.videoChallengeID, mov]; 
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:fullComponent]; 
    NSURL *url = [NSURL fileURLWithPath:fullPath]; 

    UIView *blueView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, videoCell.frame.size.width, videoCell.frame.size.height)]; 
    blueView.backgroundColor = [UIColor blueColor]; 
    [videoCell.contentView insertSubview:blueView belowSubview:videoCell.bottomView]; 
    videoCell.item = [AVPlayerItem playerItemWithURL:url]; 
    self.player = [[AVPlayer alloc] initWithPlayerItem:videoCell.item]; 
    [self.player setMuted:YES]; 
    self.player.actionAtItemEnd = AVPlayerActionAtItemEndNone; 
    AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player]; 
    playerLayer.frame = CGRectMake(0, 0, videoCell.frame.size.width, videoCell.frame.size.height); 
    playerLayer.backgroundColor = [UIColor lightGrayColor].CGColor; 
    playerLayer.videoGravity = AVLayerVideoGravityResize; 
    [blueView.layer addSublayer:playerLayer]; 
    [self.player play]; 

私ははっきりフレームを正しく設定し、それが動作しますが、ロード最初の2つのセルを除いて、テーブルビューが初めてロードされたとき。たびに正しく機能します。何が起こっているのだろうか?あなたのセルに

+1

で正しくビデオレイヤーのフレームを設定していますそれが何であるべきかに設定されています。それらが再利用されるとき、それはうまくいくが、彼らが最初にインスタンス化されるときではない。あなたがすべきことは、カスタムUItableViewCellサブクラスを作成し、次に 'layoutSubviews'関数でビデオレイヤーのフレームを適切に設定することです。 –

+0

これを答えに入れて、正しいとマークします。ありがとう! – joey

+0

完了、ありがとうございました –

答えて

1

セルが最初にインスタンス化されるので、セル自体のフレームは、それが何であるべきかに設定されていません。それらが再利用されるとき、それはうまくいくが、彼らが最初にインスタンス化されるときではない。あなたは何をすべき

は、カスタムUITableViewCellのサブクラスを作成し、セルがインスタンス化される最初の時間は、電池自体のフレームではないのでlayoutSubviews機能

1

オーバーライド

-(void)layoutSubviews { 
    [super layoutSubviews] 
} 

layer.frame = self.bounds 

層フレームを設定あなたのセルは、恐ろしく非効率的にセットアップようだと、あなたは、最適なパフォーマンスのためのビューやレイヤーのようなものを再利用し、ちょうどあなたに渡す必要がありますプレーヤー。

+0

私はそれを以前に試みました。しかし、他の人が見ているように、それは重大なパフォーマンスの問題につながります:http://stackoverflow.com/questions/25352155/changing-playeritem-of-avplayer-in-uitableview – joey

+0

replaceItemが遅れてもBlueViewを再利用してもAVPlayerLayerは可能です。 – SeanLintern88

関連する問題