在UITableViewCell中播放视频

时间:2013-04-02 02:11:50

标签: ios

我正在尝试在单元格中播放视频而不是全屏视频显示。我为此目的使用MPMoviePlayerController

我已经定义了

MPMoviePlayerController *moviePlayer;

在实施部分

然后在cellForRowAtIndexPath:

我这样做

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;的点是全局定义的,它不仅仅坚持其单元格,而是在向下滚动时继续向下。我不确定除了我所描述的之外还有什么其他方式来实现这一点,这显然似乎不是正确的方法。如果有人能引导我走向正确的方向,我将非常感激。

由于

3 个答案:

答案 0 :(得分:8)

永远不要在细胞中添加子视图:

[cell addSubview:moviePlayer.view];

仅将其添加到contentView:

[cell.contentView addSubview:moviePlayer.view];

你犯的另一个重大错误就是你忘记了这个细胞可以重复使用;当用户滚动时,该单元格用于表格的不同行。因此它被重用,现在电影播放器​​视图仍在其中,即使现在这是表的错误行。您不仅需要影片播放器视图添加到正确的单元格,还需要从所有错误的单元格中删除(在else部分中码)。

答案 1 :(得分: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

答案 2 :(得分:2)

当调用以下UITableViewDelegate方法时,您可以在单元格上创建并覆盖它,而不是为每个单元格创建播放器。你仍然可以拥有一个看起来像玩家的图像,添加到每个单元格中,以便给出外观和感觉,好像每个单元格都是一个玩家。

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