gpt4 book ai didi

ios - TableView Cell 视频自动播放

转载 作者:IT王子 更新时间:2023-10-29 08:11:40 25 4
gpt4 key购买 nike

我做了什么:-

I had added the code which plays a video when cell is fully visible and when I scrolls down or up it reload the tableview again and plays video again. But, my requirement is different.

我真正想要的是:

I want to play a video untill the backward or forward cell fully visible. When user scroll downs or up it doesn’t affect untill the backward or forward cell fully visible.

设计

Table Cell Layout Description
-> Video Table Cell (Fix height 393)
-> Content View
-> Main view - (as per Content view of Table view Cell)
-> Title View (0, 0, MainView.width, 57)
-> Video View (0, 57, MainView.width, 200);
-> Description View (0, 257, MainView.width, 136)

编码:

VideoTableCell.h

#import <UIKit/UIKit.h>

#import <AVFoundation/AVFoundation.h>



@interface VideoTableCell : UITableViewCell

@property (strong, nonatomic) IBOutlet UIView *viewForVideo;

@property (strong, nonatomic) IBOutlet UIImageView *imgThumb;

@property (strong, nonatomic) IBOutlet UIButton *btnPlay;

@property (strong, nonatomic) AVPlayerItem* videoItem;

@property (strong, nonatomic) AVPlayer* videoPlayer;

@property (strong, nonatomic) AVPlayerLayer* avLayer;



@end

VideoTableCell.m

#import "VideoTableCell.h"

@implementation VideoTableCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

return self;
}
- (void)layoutSubviews
{
[super layoutSubviews];
[self.avLayer setFrame:CGRectMake(self.viewForVideo.frame.origin.x, self.viewForVideo.frame.origin.y, self.viewForVideo.frame.size.width, self.viewForVideo.frame.size.height)];

}

@end

VideoVC.h

#import <UIKit/UIKit.h>

#import <AVFoundation/AVFoundation.h>

@interface VideoVC : UIViewController <UITableViewDataSource, UITableViewDelegate>

@property (strong, nonatomic) IBOutlet UITableView *tblData;

@end

VideoVC.m

#import "VideoVC.h"

#import "VideoTableCell.h"



@interface VideoVC ()

{
NSArray *arrVideo ;
bool isScrolling;
int index;
BOOL fullvisible ;

}
@end

@implementation VideoVC

- (void)viewDidLoad {

[super viewDidLoad];

arrVideo = [[NSArray alloc]initWithObjects:@"http://video/1.mp4",@"http://video/2.mp4", @"http://video/3.mp4", @"http://video/4.mp4", @"http://video/5.mp4", nil];

fullvisible = YES;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return arrVideo.count;
}

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
VideoTableCell *cell = [tableView dequeueReusableCellWithIdentifier:@"VideoTableCell"];
if (cell == nil)
{
cell = [[[NSBundle mainBundle] loadNibNamed:@"VideoTableCell" owner:self options:nil]objectAtIndex:0];
}

int temp = [self getVisibleIndex];

if (temp == indexPath.row && fullvisible)
{
cell.imgThumb.hidden = YES ;
//NSLog(@"fullvisible == 1");
NSURL *url = [NSURL URLWithString:[arrVideo objectAtIndex:indexPath.row]];

cell.videoItem = [AVPlayerItem playerItemWithURL:url];
cell.videoPlayer = [AVPlayer playerWithPlayerItem:cell.videoItem];
cell.avLayer = [AVPlayerLayer playerLayerWithPlayer:cell.videoPlayer];

[cell.avLayer setBackgroundColor:[UIColor whiteColor].CGColor];
// [cell.avLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[cell.contentView.layer addSublayer:cell.avLayer];
[cell.videoPlayer play];

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
}
else
{
cell.imgThumb.hidden = NO ;
cell.videoPlayer = nil;
[cell.avLayer removeFromSuperlayer];
cell.videoItem = nil;
[cell.videoPlayer pause];
}
return cell ;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 393 ;
}


-(int)getVisibleIndex

{
for (NSIndexPath *indexPath in _tblData.indexPathsForVisibleRows) {

CGRect cellRect = [_tblData rectForRowAtIndexPath:indexPath];
BOOL isVisible = CGRectContainsRect(_tblData.bounds, cellRect);

if (isVisible)

{
index = (int)indexPath.row ;
}
}
return index ;
}

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView

{

NSArray* cells = _tblData.visibleCells;

for (VideoTableCell* cell in cells)

{

NSIndexPath *path = [_tblData indexPathForCell:cell] ;

index =(int) path.row;

fullvisible = YES;

[_tblData reloadData];

}
}

最佳答案

每个 UITableViewCell 子类都有一个方法 prepareForReuse: 所以在你的 VideoTableCell 中添加一个方法:

-(void)prepareForReuse {
[super prepareForReuse];
[self.videoPlayer play];
}

然后在你的 Controller 中实现一个委托(delegate)方法:- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

[cell stopVideo];
}

stopVideo 中只需添加 [self.videoPlayer pause][cell.videoPlayer stop]

关于ios - TableView Cell 视频自动播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34767717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com