Хобрук: Ваш путь к мастерству в программировании

Как воспроизвести видео (автовоспроизведение) в UITableViewCell в iOS

Я воспроизвожу видео в UITableViewCell. Для этого я использую следующий код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *VideoCellIdentifier = @"VideoCell";

    NSDictionary *_response_data = [self.response objectAtIndex:indexPath.row];

    VideoCustomCell *cell = (VideoCustomCell *) [tableView dequeueReusableCellWithIdentifier:VideoCellIdentifier];

    if (cell == nil) {
        NSArray *topLevelObjects;
        topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"VideoCustomCell" owner:self options:nil];
        for (id currentObject in topLevelObjects){
            if ([currentObject isKindOfClass:[UITableViewCell class]]){
                cell =  (VideoCustomCell *) currentObject;
                cell.delegate  = self;
                break;
            }
        }
    }

    avPlayer = [[AVPlayer playerWithURL:[NSURL URLWithString:[_response_data valueForKey:@"media_id"]]] retain];
    avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];
    avPlayerLayer.frame = cell.video_player_view.layer.bounds;
    avPlayerLayer.videoGravity = AVLayerVideoGravityResize;
    [cell.video_player_view.layer addSublayer: avPlayerLayer];
    [avPlayer play];

    return cell;
}

Видео воспроизводится правильно, но я хочу воспроизводить только одно видео за раз. Воспроизведите видео ячейки, которая полностью видна.


  • Пожалуйста, проверьте следующую ссылку: stackoverflow.com/q/34767717/6088680 24.05.2018
  • @San007 San007 Ваш код автоматически воспроизводит все видео в ячейках? 17.08.2018

Ответы:


1

Используйте эти два метода прокрутки и управления воспроизведением видео. Эти два метода будут вызываться в любом случае, когда табличное представление перестанет прокручиваться.

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    if(![scrollView isDecelerating] && ![scrollView isDragging]){

        [self playVideo];
    }
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    if(!decelerate){

        [self playVideo];
    }
}


-(void)playVideo
{
    if(aryTableData.count==0){
        return;
    }

    for(UITableViewCell *cell in [tblView visibleCells])
    {
        VideoCell *ccell = (VideoCell*)cell;

        CGRect ccellRect = [APP_DEL.window convertRect:ccell.bounds fromView:ccell];

        // NSLog(@"--Cell frame %f",ccellRect.origin.y);

        //Set Condition of cell visible within some range
        if(ccellRect.origin.y>-200)
        {
            // Handle Video Play

            int row = [[tblView indexPathForCell:ccell] row];
            NSString *strUrl = [[aryTableData objectAtIndex:row] valueForKey:@"video_url"] ;
            [ccell startVideoFromURL:strUrl]; //You can handle video play in cell or table view
        }
    }
}
16.01.2014
  • что такое метод convertRect? 21.03.2016

  • 2

    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];
        }
    }
    
    28.09.2013
  • Я не хочу делать это по событию клика, я хочу автоматически воспроизводить видео, когда ячейка видна. 28.09.2013
  • Поэтому, если вы хотите так играть, вам не следует писать свой код в cellforrowatindexpath и писать его в viewWillAppear, брать цикл for для массива и воспроизводить его из индекса массива. Получите полное время песни и по мере ее завершения загрузите следующую песню из этого массива. Используйте таблицу только для отображения с некоторой логикой, которая воспроизводит песню. 29.09.2013
  • Вы не понимаете мою проблему, спасибо за ваши усилия. 29.09.2013
  • Новые материалы

    Создание успешной организации по науке о данных
    "Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

    Технологии и проблемы будущей работы
    Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

    Игорь Минар из Google приедет на #ReactiveConf2017
    Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...