2016-01-13 3 views
18

Что я сделал: -TableView Cell видео автозапуск

Я добавил код, который играет видео, когда клетка полностью виден и когда я прокручивается вниз или вверх он снова играет и перезагрузить TableView видео снова. Но, мои требования разные.

Что я на самом деле хочу:

Я хочу играть видео недо назад или вперед клетки полностью видны. Когда пользователь прокручивает вниз или вверх, он не влияет, пока 10 обратная или передняя камера полностью не видна.

Дизайн

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

    } 
} 
+0

Может быть, установив 'actionAtItemEnd', чтобы сделать паузу, проверяя с КВО состояние паузы, проверяя, если' player.currentTime == player.currentItem .duration' (это то, что вы хотите), и играя в следующий пункт, если это так. Другими словами, создавая микро-паузу между пунктами ... – Larme

+0

Попробуйте этот ответ: [http://stackoverflow.com/questions/9831485/best-way-to-check-if-uitableviewcell-is-completely-visible ] (http://stackoverflow.com/questions/9831485/best-way-to-check-if-uitableviewcell-is-completely-visible) –

ответ

14

Каждый UITableViewCell подкласс имеет метод prepareForReuse: так в вашем VideoTableCell просто добавить метод:

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

И в контроллере реализован метод делегата: - (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]

-2

Напишите категорию для UITableViewCell, чтобы проверить, полностью ли видима ячейка:

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

И в cellForRowAtIndexpath: проверить, если ячейка полностью виден. Если ячейка полностью видима, воспроизведение видео еще остановится/приостановится.

4

попробовать это методы в 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 
} 

должен помочь вам.

Если это не будет полностью работать на ваши требования попытаться переопределить scrollViewDidScroll more details there