2013-04-02 132 views
5

我試圖在單元本身播放視頻而不是全屏視頻顯示。爲此,我正在使用MPMoviePlayerController在UITableViewCell中播放視頻

我在執行部分cellForRowAtIndexPath:

定義

MPMoviePlayerController *moviePlayer; 

然後我做這個

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 
      } 

,顯然我爲它分配一個高度heightForRowAtIndexPath:

但它的全局定義爲MPMoviePlayerController *moviePlayer;,它並不僅限於它的單元格,而是隨着向下滾動而不斷下降。我不確定除了我所描述的之外,還有什麼其他方式來實現這一點,顯然這似乎不是正確的方式。如果有人能指引我走向正確的方向,我將不勝感激。

感謝

回答

8

一個子視圖決不添加到單元格:

[cell addSubview:moviePlayer.view]; 

它僅添加到內容查看:

[cell.contentView addSubview:moviePlayer.view]; 

你正在做的另一個大錯誤是,你」重新忘記這個細胞可以重複使用;當用戶滾動時,該單元格將用於表格的不同行。所以它被重用,現在電影播放器​​視圖仍然存在,即使這現在是表格的錯誤行。您不僅需要電影播放器​​視圖添加到右側單元格中,您需要從刪除它從所有錯誤的單元格中(在您的代碼的else部分中)。

+0

亞光,我將如何刪除它? – Jonathan

+0

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

+0

我這樣做,但是當我向下滾動然後向上滾動時,視頻不在單元格中了 – Jonathan

2

而不是爲每個單元格創建播放器,而是在調用以下UITableViewDelegate方法時,可以在單元格上創建並覆蓋它。您仍然可以看到一個看起來像玩家的圖像,並將其添加到每個單元格中,以便爲每個單元格的玩家提供外觀和感覺。

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

每當單元格出現在屏幕上時,您都不應該分配新對象。您應該創建一個UITableViewCell的子類並添加一個MPMoviePlayerController作爲一個屬性,該屬性可以設置爲播放或停止並隱藏視圖(如果沒有視頻)。所以,你的代碼看起來應該更像:

#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; 
     } 

現在的情況下,你不知道一個小區應該是什麼樣子 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

在layoutSubview中,它應該是self.movi​​e.view.frame。 – Sebyddd