2013-04-02 12 views
5

Sto provando a riprodurre video nelle celle stesse anziché a schermo intero. Sto usando MPMoviePlayerController per questo scopo.riproduzione di video in UITableViewCell

ho definito

MPMoviePlayerController *moviePlayer; 

nella sezione implementazione

Poi nel cellForRowAtIndexPath:

faccio questo

cell = [tableView dequeueReusableCellWithIdentifier:simpleTableVideoIdentifier]; 

      if (cell == nil){ 
       cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableVideoIdentifier]; 
      } 
      NSDictionary *dictionary = [dataArray objectAtIndex:indexPath.section]; 
      NSDictionary *data = dictionary; 
      if ([data[@"type_of_post"] isEqualToString:@"video"]) { 
       NSString *path = data[@"video"]; 
       NSURL *videoURL = [NSURL URLWithString:path]; 
       moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:videoURL]; 
       [moviePlayer setControlStyle:MPMovieControlStyleNone]; 
       moviePlayer.scalingMode = MPMovieScalingModeAspectFit; 
       [moviePlayer.view setFrame:CGRectMake(10.0, 0.0, 300.0 , 400.0)]; 
       [cell addSubview:moviePlayer.view]; 
       moviePlayer.view.hidden = NO; 
       [moviePlayer prepareToPlay]; 
       [moviePlayer play]; 
      }else{ 
       //do something else 
      } 

e ovviamente gli assegno un'altezza in heightForRowAtIndexPath:

ma il punto come MPMoviePlayerController *moviePlayer; è definito globalmente, non si attacca solo alla sua cella ma continua a scendere mentre scorro verso il basso. Non sono sicuro di quale altro modo di implementare questo diverso da quello che ho descritto, che chiaramente non sembra il modo giusto per farlo. Mi piacerebbe davvero che qualcuno mi guidasse nella giusta direzione.

Grazie

risposta

8

Mai aggiungere una visualizzazione secondaria alla cella:

[cell addSubview:moviePlayer.view]; 

aggiungerlo solo al contentView:

[cell.contentView addSubview:moviePlayer.view]; 

L'altro grande errore che stai facendo è che si' dimenticando che questa cella può essere riutilizzata; mentre l'utente scorre, la cella deve essere utilizzata per una riga diversa della tabella. Quindi viene riutilizzato e ora la vista del riproduttore video è ancora presente anche se questa è ora la riga sbagliata del tavolo. Non è necessario solo aggiungere la visualizzazione del riproduttore di filmati alla cella di destra, è necessario rimuovere da tutte le celle errate (nella parte else del codice).

+0

matt, come lo rimuoverò comunque? – Jonathan

+0

con '[cell.contentView removeFromSuperview]'? – Jonathan

+0

Lo faccio, ma quando si scorre verso il basso e si scorre di nuovo, il video non è più nella cella – Jonathan

2

Invece di creare il lettore per ogni cella, è possibile creare e sovrapporlo sulla cella quando viene chiamato il seguente metodo UITableViewDelegate. Potresti comunque avere un'immagine che assomiglia al giocatore, aggiunta a ciascuna cella per dare l'aspetto e la sensazione che ogni cellula sia un giocatore.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
8

Non si dovrebbero assegnare nuovi oggetti ogni volta che la cella viene visualizzata sullo schermo. Dovresti creare una sottoclasse di UITableViewCell e aggiungere un MPMoviePlayerController come una proprietà che può essere impostata per riprodurre o interrompere e nascondere la vista in assenza di video. Così il vostro codice dovrebbe essere qualcosa di più simile:

#import CustomCell.h  
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdent"]; 
    if (!cell) { 
     cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cellIdent"]]; 
    } 

    NSDictionary *dict = dataArray[indexPath.row]; 
    if ([dict[@"type_of_post"] isEqualToString:@"video"]) { 
     NSString *path = @"http://<path to your video>"; 
     [cell.movie setContentURL:[NSURL URLWithString:path]]; 
     [cell.movie prepareToPlay]; 
     [cell.movie play]; 
     cell.movie.view.hidden = NO; 
    } else { 
     [cell.movie stop]; 
     cell.movie.view.hidden = YES; 
     } 

Ora, nel caso in cui non sanno come una cellula dovrebbe apparire CustomCell.h:

@interface CustomCell : UITableViewCell 
@property (nonatomic, retain) MPMoviePlayerController *movie; 
@end 

CustomCell.m:

@implementation CustomCell 
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     self.movie = [[MPMoviePlayerController alloc] init]; 
     self.movie.controlStyle = MPMovieControlStyleNone; 
     self.movie.scalingMode = MPMovieScalingModeAspectFit; 
     [self.contentView addSubview:self.movie.view]; 
    } 
    return self; 
} 
- (void)layoutSubviews { 
    [super layoutSubviews]; 
    self.movie.frame = CGRectMake(10, 0, self.bounds.size.width - 20, self.bounds.size.height); 
} 
@end 
+3

In layoutSubview, invece, dovrebbe essere self.movie.view.frame. – Sebyddd

Problemi correlati