with multiple form example different custom ios objective-c uitableview uiscrollview tableviewcell

ios - multiple - Reproducción automática de video TableView Cell



uitableview swift 4 (3)

Cada subclase UITableViewCell tiene un método prepareForReuse: así que en su VideoTableCell solo agregue un método:

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

Y en su controlador, implemente un método delegado: - (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { [cell stopVideo]; }

y en stopVideo solo agrega [self.videoPlayer pause] o [cell.videoPlayer stop]

Lo que había hecho:

Había añadido el código que reproduce un video cuando la celda está completamente visible y cuando me desplazo hacia arriba o hacia arriba, vuelve a cargar la vista de tabla y reproduce el video nuevamente. Pero, mi requerimiento es diferente.

Lo que realmente quiero:

Quiero reproducir un video hasta que la celda hacia atrás o hacia adelante sea completamente visible. Cuando el usuario se desplaza hacia abajo o hacia arriba, no afecta hasta que la celda anterior o posterior sea completamente visible.

Diseño

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)

Codificación:

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


Escriba una categoría para que UITableViewCell compruebe si la celda es completamente visible:

UITableViewCell + FullyVisible

-(BOOL) isFullyVisible { UITableView *tableview = (UITableView *)[self parents:[UITableView class]]; CGRect rect = [tableview rectForRowAtIndexPath:[tableview indexPathForCell:self]]; rect = [tableview convertRect:rect toView:tableview.superview]; return CGRectContainsRect(tableview.frame, rect); }

Y en cellForRowAtIndexpath: verifique si la celda es completamente visible. Si la celda es totalmente visible, reproduzca el video, de lo contrario, pare / pause.


Prueba estos métodos en UITableView.

func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { // stop video } func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { // play video }

debería ayudarte

Si esto no funciona completamente para sus requisitos, intente anular scrollViewDidScroll más detalles allí