// // EZMultiChannelRealPlayVC.m // EZOpenSDKDemo // // Created by yuqian on 2020/3/10. // Copyright © 2020 hikvision. All rights reserved. // #import "EZMultiChannelRealPlayVC.h" #import "EZOnlineCameraCell.h" #import "EZOfflineCameraCell.h" #import "EZEncryptCameraCell.h" #import "EZDeviceInfo.h" #import "EZCameraInfo.h" #import "UIAlertController+TextField.h" #import "EZLivePlayViewController.h" #import "UIView+Toast.h" @interface EZMultiChannelRealPlayVC () @property (nonatomic, strong) UICollectionView *collectionView; @property (nonatomic, strong) UICollectionViewFlowLayout * flowLayout; @property (nonatomic, strong) NSArray *devices; @property (nonatomic, strong) NSMutableArray *cameras; @property (nonatomic, strong) NSMutableArray *playingCameras; @property (nonatomic, assign) BOOL thumbMode; @end static NSString * identifier1 = @"EZOnlineCameraCell"; static NSString * identifier2 = @"EZOfflineCameraCell"; static NSString * identifier3 = @"EZEncryptCameraCell"; static CGFloat kMagin = 20.f; @implementation EZMultiChannelRealPlayVC - (instancetype)initWithDevices:(NSArray *)devices { self = [super init]; if (self) { [self gatherCamerasData:devices]; } return self; } - (void)viewDidLoad { [super viewDidLoad]; self.title = @"多通道预览"; self.view.backgroundColor = [UIColor whiteColor]; UIBarButtonItem *rightItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemBookmarks target:self action:@selector(resizeCollectionLayout)]; self.navigationItem.rightBarButtonItem = rightItem; [self.view addSubview:self.collectionView]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self schedulePlayCameras]; } - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; [self stopAllCameraPreview]; } -(UICollectionView *)collectionView{ if (!_collectionView) { self.flowLayout = [[UICollectionViewFlowLayout alloc]init]; CGFloat itemWidth = (self.view.frame.size.width - 2 * kMagin); _flowLayout.itemSize = CGSizeMake(itemWidth, itemWidth * 9/16); _flowLayout.minimumLineSpacing = 10; _flowLayout.minimumInteritemSpacing = 10; _flowLayout.sectionInset = UIEdgeInsetsMake(kMagin, kMagin, kMagin, kMagin); _collectionView = [[UICollectionView alloc]initWithFrame:self.view.frame collectionViewLayout:_flowLayout]; _collectionView.showsVerticalScrollIndicator = NO; _collectionView.bounces = NO; _collectionView.backgroundColor = [UIColor whiteColor]; [_collectionView registerClass:[EZOnlineCameraCell class] forCellWithReuseIdentifier:identifier1]; [_collectionView registerClass:[EZOfflineCameraCell class] forCellWithReuseIdentifier:identifier2]; [_collectionView registerClass:[EZEncryptCameraCell class] forCellWithReuseIdentifier:identifier3]; _collectionView.dataSource = self; _collectionView.delegate = self; } return _collectionView; } - (NSMutableArray *)playingCameras { if (!_playingCameras) { _playingCameras = [NSMutableArray arrayWithCapacity:5]; } return _playingCameras; } #pragma mark - Fetch data - (void) gatherCamerasData:(NSArray *)devices { self.devices = devices; self.cameras = [NSMutableArray arrayWithCapacity:5]; for (EZDeviceInfo *deviceInfo in devices) { for (EZCameraInfo *cameraInfo in deviceInfo.cameraInfo) { cameraInfo.status = deviceInfo.status; cameraInfo.isEncrypt = deviceInfo.isEncrypt; [self.cameras addObject:cameraInfo]; } } } #pragma mark - Action - (void) resizeCollectionLayout { self.thumbMode = !self.thumbMode; CGFloat itemWidth; if (self.thumbMode) { itemWidth = (self.view.frame.size.width - 3 * kMagin)/2; _flowLayout.itemSize = CGSizeMake(itemWidth, itemWidth * 9/16); } else { itemWidth = (self.view.frame.size.width - 2 * kMagin); _flowLayout.itemSize = CGSizeMake(itemWidth, itemWidth * 9/16); } [self.collectionView performBatchUpdates:^{ [self.collectionView reloadData]; } completion:^(BOOL finished) { [self schedulePlayCameras]; }]; } #pragma mark - CollectionView Delegate - (NSInteger)collectionView:(nonnull UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return _cameras.count; } - (nonnull __kindof UICollectionViewCell *)collectionView:(nonnull UICollectionView *)collectionView cellForItemAtIndexPath:(nonnull NSIndexPath *)indexPath { EZCameraInfo *camera = _cameras[indexPath.row]; NSString *verifyCode = [[GlobalKit shareKit].deviceVerifyCodeBySerial objectForKey:camera.deviceSerial]; if (camera.status == 1) { if (camera.isEncrypt && verifyCode.length == 0) { EZEncryptCameraCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier3 forIndexPath:indexPath]; return cell; } else { EZOnlineCameraCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier1 forIndexPath:indexPath]; return cell; } } else { EZOfflineCameraCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier2 forIndexPath:indexPath]; return cell; } } - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { id cell = [collectionView cellForItemAtIndexPath:indexPath]; EZCameraInfo *cameraInfo = _cameras[indexPath.row]; if ([cell isKindOfClass:[EZEncryptCameraCell class]]) { __weak typeof(self) weakSelf = self; UIAlertController *vc = [UIAlertController showAlertVC:cameraInfo.deviceSerial confirmHandler:^(NSString * _Nonnull code) { __strong typeof(weakSelf) strongSelf = weakSelf; if (code.length >= 6) { [collectionView reloadItemsAtIndexPaths:@[indexPath]]; dispatch_async(dispatch_get_main_queue(),^{ [strongSelf schedulePlayCameras]; }); } else{ [strongSelf.view makeToastCenter:@"请输入正确的验证码"]; } }]; [self presentViewController:vc animated:YES completion:nil]; } else if ([cell isKindOfClass:[EZOnlineCameraCell class]]) { EZLivePlayViewController *vc = [[UIStoryboard storyboardWithName:@"EZMain" bundle:nil] instantiateViewControllerWithIdentifier:@"EZLivePlayViewController"]; vc.deviceInfo = [self getSelectedDeviceInfo:cameraInfo.deviceSerial]; vc.cameraIndex = cameraInfo.cameraNo-1; [self.navigationController pushViewController:vc animated:YES]; } } - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { if (!decelerate) { [self schedulePlayCameras]; } } - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { NSLog(@"Mulitplay ----- %s", __func__); [self schedulePlayCameras]; } #pragma mark - Private Methods - (EZDeviceInfo *) getSelectedDeviceInfo:(NSString *)deviceSerial { for (EZDeviceInfo *deviceInfo in _devices) { if ([deviceInfo.deviceSerial isEqualToString:deviceSerial]) { return deviceInfo; } } return nil; } - (void) schedulePlayCameras { [self clearOutsideCamera]; for (UITableViewCell *cell in self.collectionView.visibleCells) { if ([cell isMemberOfClass:[EZOnlineCameraCell class]]) { EZOnlineCameraCell *onlineCameraCell = (EZOnlineCameraCell *)cell; NSIndexPath *indexPath = [self.collectionView indexPathForCell:onlineCameraCell]; EZCameraInfo *camera = _cameras[indexPath.row]; NSString *verifyCode = [[GlobalKit shareKit].deviceVerifyCodeBySerial objectForKey:camera.deviceSerial]; if (!onlineCameraCell.isPlaying) { [onlineCameraCell startPlayWithDeviceSerial:camera.deviceSerial cameraNo:camera.cameraNo verifyCode:verifyCode]; } if (![self.playingCameras containsObject:onlineCameraCell]) { [self.playingCameras addObject:onlineCameraCell]; } } } NSLog(@"Mulitplay ----- after schedule ------ playingCameras :%@, visibleCells :%@", self.playingCameras, self.collectionView.visibleCells); } - (void) clearOutsideCamera { NSLog(@"Mulitplay ----- before clear ------ playingCameras :%@, visibleCells :%@", self.playingCameras, self.collectionView.visibleCells); NSEnumerator *enumerator = [self.playingCameras reverseObjectEnumerator]; for (EZOnlineCameraCell *cell in enumerator) { if (![self.collectionView.visibleCells containsObject:cell]) { [cell stopPlay]; if ([self.playingCameras containsObject:cell]) { [self.playingCameras removeObject:cell]; } } } NSLog(@"Mulitplay ----- after clear ------ playingCameras :%@, visibleCells :%@", self.playingCameras, self.collectionView.visibleCells); } -(void) stopAllCameraPreview { for (EZOnlineCameraCell *cell in self.playingCameras) { [cell stopPlay]; } } @end