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