2016-03-30 7 views
0

Ich habe ein seltsames Problem. Ich habe eine Tabellenansicht und die Zellen enthalten ein Video. Ich habe die AVPlayerLayer so eingestellt, dass sie sich auf die Größe der Zelle ausdehnt, aber wenn die Tabellenansicht zuerst geladen wird, macht sie das nicht, nur für die ersten 2 Zellen. Für Zellen 3 + lädt es korrekt, und wenn ich die Tabellenansicht von unten nach oben zurückscrolle, werden die Zellen für die ersten 2 korrekt geladen. Ich habe ein 13 Sekunden langes Youtube-Video erstellt, um genau zu zeigen, was ich meine. Beachten Sie den Leerraum am unteren Rand der ersten beiden Zellen während der ersten Sekunden des Videos. Wenn ich zurück scrolle, ist dieser Raum nicht da, die Grenzen der AVPlayerLayer sind korrekt.AVPlayerLayer setzt nur korrekt auf Grenzen ändern

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

Hier ist mein Code, der die Tableview Zelle, in cellForRowAtIndexPath aufstellt:

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]; 

ich deutlich den Rahmen richtig eingestellt, und es funktioniert, mit Ausnahme der ersten 2-Zellen, die Last, Beim ersten Laden der Tabellenansicht. Jedes andere Mal funktioniert es richtig. Irgendeine Idee was könnte los sein?

+1

Da das erste Mal, wenn die Zelle instanziiert wird, wobei der Rahmen der Zelle selbst nicht ist stellen Sie auf, was es sein sollte. Wenn sie wiederverwendet werden, ist es in Ordnung, aber nicht, wenn sie zuerst instanziiert werden. Was Sie tun sollten, ist eine benutzerdefinierte UItableViewCell-Unterklasse erstellt, und stellen Sie den Rahmen der Video-Ebene richtig in der Funktion "layoutSubviews" –

+0

setzen Sie dies als eine Antwort, und ich werde es richtig markieren. Vielen Dank! – joey

+0

Fertig, danke –

Antwort

1

Da die Zelle zum ersten Mal instanziiert wird, wird der Rahmen der Zelle selbst nicht so eingestellt, wie er sein sollte. Wenn sie wiederverwendet werden, ist es in Ordnung, aber nicht, wenn sie zuerst instanziiert werden.

Was sollten Sie tun, ist eine benutzerdefinierte UITableViewCell Unterklasse erstellen, und legen Sie dann den Rahmen der Videoschicht richtig in der layoutSubviews Funktion

1

Überschreibung

-(void)layoutSubviews { 
    [super layoutSubviews] 
} 

auf Ihr Handy und stellen Sie die Schichtrahmen

layer.frame = self.bounds 

Ihre Zelle Setup scheint schrecklich ineffizient und Sie sollten Sachen wie Ansichten und Schichten für eine optimale Leistung wieder verwenden und geben Sie einfach in Ihrem Spieler.

+0

Ich habe das vorher versucht. Aber wie andere festgestellt haben, führt das zu erheblichen Performance-Problemen: http://stackoverflow.com/questions/25352155/changing-playeritem-of-avplayer-inuitableview – joey

+0

Auch wenn replaceItem ist lagy wiederverwendet die BlueView und AVPlayerLayer ist immer noch möglich . – SeanLintern88