From b4e1288a9b63eb820e9c9489c56aac4bf6b31067 Mon Sep 17 00:00:00 2001 From: Davin <591807572@qq.com> Date: 星期三, 18 十二月 2024 14:34:16 +0800 Subject: [PATCH] feature 图片资源更新 --- EZSDK/EZSDK/EZ/UIViewControllers/EZPlaybackViewController.m | 479 +++++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 350 insertions(+), 129 deletions(-) diff --git a/EZSDK/EZSDK/EZ/UIViewControllers/EZPlaybackViewController.m b/EZSDK/EZSDK/EZ/UIViewControllers/EZPlaybackViewController.m index f1957be..836d0d4 100644 --- a/EZSDK/EZSDK/EZ/UIViewControllers/EZPlaybackViewController.m +++ b/EZSDK/EZSDK/EZ/UIViewControllers/EZPlaybackViewController.m @@ -10,27 +10,31 @@ #import "UIViewController+EZBackPop.h" #import "DDCollectionViewFlowLayout.h" #import "MJRefresh.h" -#import "EZRecordDownloader.h" -#import "EZDeviceRecordDownloadTask.h" -#import "EZCloudRecordDownloadTask.h" +#import <EZOpenSDKFramework/EZRecordDownloader.h> +#import <EZOpenSDKFramework/EZDeviceRecordDownloadTask.h> +#import <EZOpenSDKFramework/EZCloudRecordDownloadTask.h> #import "EZRecordCell.h" #import "DDKit.h" -#import "EZCloudRecordFile.h" -#import "EZDeviceRecordFile.h" -#import "EZPlayer.h" +#import <EZOpenSDKFramework/EZCloudRecordFile.h> +#import <EZOpenSDKFramework/EZDeviceRecordFile.h> +#import <EZOpenSDKFramework/EZPlayer.h> #import "HIKLoadView.h" #import "Masonry.h" -#import "EZCameraInfo.h" +#import <EZOpenSDKFramework/EZCameraInfo.h> #import "MBProgressHUD.h" #import "Toast+UIView.h" #import "EZCustomTableView.h" -#import "EZStreamPlayer.h" +#import <EZOpenSDKFramework/EZStreamPlayer.h> +#import <Photos/Photos.h> +#import "FCFileManager.h" +#import <EZOpenSDKFramework/EZVideoTransformer.h> @interface EZPlaybackViewController ()<DDCollectionViewDelegateFlowLayout, UICollectionViewDataSource,EZPlayerDelegate, UIAlertViewDelegate, EZRecordCellDelegate, EZCustomTableViewDelegate,EZStreamPlayerDelegate> { BOOL _isOpenSound; BOOL _isPlaying; + BOOL _landscape; // 鏄惁鏃嬭浆 NSTimeInterval _playSeconds; //鎾斁绉掓暟 NSTimeInterval _duringSeconds; //褰曞儚鏃堕暱 @@ -44,8 +48,8 @@ NSArray *sdCardRate; NSArray *cloudRateStr; NSArray *sdCardRateStr; - -// BOOL _isDoBack; + + // BOOL _isDoBack; } @property (nonatomic, strong) NSIndexPath *selectedIndexPath; @@ -57,6 +61,7 @@ @property (nonatomic, strong) HIKLoadView *loadingView; @property (nonatomic) BOOL isSelectedDevice; @property (nonatomic, weak) IBOutlet UIView *playerView; +@property (weak, nonatomic) IBOutlet NSLayoutConstraint *playViewWHScale; @property (nonatomic, weak) IBOutlet UILabel *largeTitleLabel; @property (nonatomic, weak) IBOutlet UIDatePicker *datePicker; @property (nonatomic, weak) IBOutlet UITextField *dateTextField; @@ -102,12 +107,20 @@ [EZOPENSDK releasePlayer:_player]; } +- (void)viewWillAppear:(BOOL)animated +{ + [super viewWillAppear:animated]; + self.navigationController.navigationBar.hidden = NO;//2021-02-01 + +} + - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.isAutorotate = YES; self.largeTitleLabel.text = self.deviceInfo.deviceName; self.largeTitleLabel.hidden = YES; + _landscape = NO; if(!_records) _records = [NSMutableArray new]; @@ -154,7 +167,7 @@ [self.duringSlider setThumbImage:[UIImage imageNamed:@"slider"] forState:UIControlStateNormal]; [self.duringSlider setThumbImage:[UIImage imageNamed:@"slider_sel"] forState:UIControlStateHighlighted]; - + self.cloudButton.selected = YES; self.largeBackButton.hidden = YES; @@ -166,7 +179,7 @@ [self.dateButton setTitle:[dateFormatter stringFromDate:self.datePicker.date] forState:UIControlStateNormal]; dateFormatter.dateFormat = @"MM-dd 鈻�"; [self.dateButton setTitle:[dateFormatter stringFromDate:self.datePicker.date] forState:UIControlStateSelected]; - + _isShowToolbox = YES; cloudRate = @[@(EZOPENSDK_PLAY_RATE_1), @@ -183,6 +196,11 @@ cloudRateStr = @[@"x1",@"x4",@"x8",@"x16",@"x32"]; sdCardRateStr = @[@"x1",@"x4",@"x8",@"x16"]; + + //2021-07-21 闅愯棌streamPlayBtn鍜宺ateBtn + [self.streamPlayBtn setHidden:YES]; + [self.rateBtn setHidden:YES]; + } - (void)viewWillDisappear:(BOOL)animated { @@ -204,18 +222,28 @@ } /* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ + #pragma mark - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. + } + */ - (UIInterfaceOrientationMask)supportedInterfaceOrientations { - return UIInterfaceOrientationMaskAllButUpsideDown; + if (@available(iOS 16.0, *)) { + if (_landscape) { + //妯睆 + return UIInterfaceOrientationMaskLandscape; + } else { + //绔栧睆 + return UIInterfaceOrientationMaskPortrait; + } + } else { + return UIInterfaceOrientationMaskAllButUpsideDown; + } } - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation @@ -230,6 +258,13 @@ self.largeButton.hidden = NO; self.voiceButton.hidden = NO; self.playButton.hidden = NO; + [self.playerView setTranslatesAutoresizingMaskIntoConstraints:NO]; + [NSLayoutConstraint deactivateConstraints:@[self.playViewWHScale]]; + self.playViewWHScale = [NSLayoutConstraint constraintWithItem:self.playerView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.playerView attribute:NSLayoutAttributeHeight multiplier:16/9. constant:0]; + [NSLayoutConstraint activateConstraints:@[self.playViewWHScale]]; + dispatch_async(dispatch_get_main_queue(), ^{ + [self.playerView layoutIfNeeded]; + }); if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { @@ -242,6 +277,18 @@ self.playbackList.hidden = YES; self.largeBackButton.hidden = NO; self.navigationController.navigationBarHidden = YES; + + CGFloat tureScreenW = HDLEZ_APP_SCREEN_WIDTH > HDLEZ_APP_SCREEN_HEIGHT ? HDLEZ_APP_SCREEN_HEIGHT : HDLEZ_APP_SCREEN_WIDTH; + CGFloat tureScreenH = HDLEZ_APP_SCREEN_WIDTH < HDLEZ_APP_SCREEN_HEIGHT ? HDLEZ_APP_SCREEN_HEIGHT : HDLEZ_APP_SCREEN_WIDTH; + + + [self.playerView setTranslatesAutoresizingMaskIntoConstraints:NO]; + [NSLayoutConstraint deactivateConstraints:@[self.playViewWHScale]]; + self.playViewWHScale = [NSLayoutConstraint constraintWithItem:self.playerView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.playerView attribute:NSLayoutAttributeHeight multiplier:tureScreenH/(tureScreenW) constant:0]; + [NSLayoutConstraint activateConstraints:@[self.playViewWHScale]]; + dispatch_async(dispatch_get_main_queue(), ^{ + [self.playerView layoutIfNeeded]; + }); } } @@ -288,6 +335,8 @@ cell.deviceSerial = _cameraInfo.deviceSerial; cell.isSelectedDevice = _isSelectedDevice; cell.delegate = self; + //2021-07-21 闅愯棌涓嬭浇鎸夐挳 + [cell.downloadBtn setHidden:NO]; if(_isSelectedDevice) { @@ -316,7 +365,7 @@ [self invalidateTimer]; -// [_player stopPlayback]; + // [_player stopPlayback]; if(_isSelectedDevice) { @@ -341,7 +390,7 @@ #pragma mark - ValidateCode Methods - (void)repeatDelay{ - + self.selectedCell = NO; } @@ -375,9 +424,16 @@ EZDeviceRecordFile *deviceFile = (EZDeviceRecordFile *)recordFile; - NSString *path = [NSString stringWithFormat:@"%@/ezopensdk/DeviceRecord/%@.ps",[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject], [dateformatter stringFromDate:deviceFile.startTime]]; + NSString *path = [NSString stringWithFormat:@"%@/ezopensdk/DeviceRecord/%@.ps",[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject], [dateformatter stringFromDate:deviceFile.startTime]]; NSLog(@"path: %@ ", path); - [self startDeviceRecordDownload:path deviceFile:deviceFile]; + __weak __typeof(self)weakSelf = self; + [self authPhotoLibraries:^(BOOL isAblity) { + if (isAblity) { + [weakSelf startDeviceRecordDownload:path deviceFile:deviceFile]; + } else { + [weakSelf guideUserOpenAuth]; + } + }]; } else { @@ -399,7 +455,7 @@ verifyCode:self.verifyCode savePath:path completion:^(EZDeviceRecordDownloadTask * _Nonnull task) { - + //璁剧疆鍥炶皟鍑芥暟 __weak typeof(task) weakTask = task; [task setDownloadCallBackWithFinshed:^(EZRecordDownloaderStatus statusCode) { @@ -408,10 +464,17 @@ NSLog(@"statuCode:%ld", (long)statusCode); switch (statusCode) { - case EZRecordDownloaderStatusFinish: - - [self.navigationController.view makeToast:[NSString stringWithFormat:@"SDD Task:%lu-涓嬭浇鎴愬姛", (unsigned long)strongTask.taskID]]; - + case EZRecordDownloaderStatusFinish:{ + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + NSLog(@"#########寮�濮嬩繚瀛樿棰戯紒锛侊紒锛�%@", path); + + NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init]; + dateformatter.dateFormat = @"yyyyMMddHHmmss"; + + NSString *mp4Path = [NSString stringWithFormat:@"%@/ezopensdk/DeviceRecord/%@.mp4", [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject], [dateformatter stringFromDate:deviceFile.startTime]]; + [self videoFormatConvertAndSave2Album:path mp4Path:mp4Path]; + }); + } break; case EZRecordDownloaderStatusMoreToken: @@ -454,6 +517,40 @@ }]; } +/** 濡傛灉闇�瑕佹妸鍥炴斁瑙嗛淇濆瓨鍒扮浉鍐岋紝涓�瀹氳鍏堟妸.ps鏂囦欢杞垚.mp4鏂囦欢 + 娉ㄦ剰锛氫笅杞藉綍鍍忚繃绋嬩腑鍥犱负缃戠粶鍘熷洜瀵艰嚧.ps鏂囦欢鏈笅杞藉畬锛屼篃鍙互璋冪敤姝ゆ柟娉曞皢宸蹭笅杞界殑褰曞儚鐗囨瑙g爜鎴�.mp4鏂囦欢銆� + */ +- (void)videoFormatConvertAndSave2Album:(NSString *)psPath mp4Path:(NSString *)mp4Path { + [FCFileManager createFileAtPath:mp4Path overwrite:YES]; + __weak typeof(self) weakSelf = self; + [EZVideoTransformer videoTransFormerPSPath:psPath toPath:mp4Path type:EZVideoTransformerTypeMP4 withKey:_verifyCode succBlock:^{ + NSLog(@"杞崲鎴愬姛"); + // 灏�.mp4鏂囦欢淇濆瓨鍒扮浉鍐� + PHPhotoLibrary *photoLibrary = [PHPhotoLibrary sharedPhotoLibrary]; + [photoLibrary performChanges:^{ + [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:[NSURL fileURLWithPath:mp4Path]]; + } completionHandler:^(BOOL success, NSError * _Nullable error) { + if (success) { + dispatch_async(dispatch_get_main_queue(), ^{ + [weakSelf.navigationController.view makeToast:HDLEZLocallizedString(@"device_save_gallery")]; + }); + NSLog(@"########淇濆瓨鎴愬姛锛侊紒锛�"); + // 涓嬭浇瀹屾垚鍚庡垹闄�.ps鍜�.mp4鏂囦欢 + [FCFileManager removeItemAtPath:psPath]; + [FCFileManager removeItemAtPath:mp4Path]; + } else { + dispatch_async(dispatch_get_main_queue(), ^{ + [weakSelf.navigationController.view makeToast:HDLEZLocallizedString(@"device_save_gallery_failure")]; + }); + } + }]; + } processBlock:^(int rate) { + // 杞崲杩涘害 + } failBlock:^(int errCode) { + NSLog(@"杞崲澶辫触"); + }]; +} + - (void) startCloudRecordDownload:(NSString*)path cloudFile:(EZCloudRecordFile *)cloudFile { EZCloudRecordDownloadTask *task = [[EZCloudRecordDownloadTask alloc] initTaskWithID:_selectedIndexPath.row cloudRecordFile:cloudFile verifyCode:self.verifyCode savePath:path]; @@ -466,9 +563,17 @@ NSLog(@"statuCode:%ld", (long)statusCode); switch (statusCode) { - case EZRecordDownloaderStatusFinish: - - [self.navigationController.view makeToast:[NSString stringWithFormat:@"CD Task:%lu-涓嬭浇鎴愬姛", (unsigned long)strongTask.taskID]]; + case EZRecordDownloaderStatusFinish: { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + NSLog(@"#########寮�濮嬩繚瀛樿棰戯紒锛侊紒锛�%@", path); + + NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init]; + dateformatter.dateFormat = @"yyyyMMddHHmmss"; + + NSString *mp4Path = [NSString stringWithFormat:@"%@/ezopensdk/DeviceRecord/%@.mp4", [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject], [dateformatter stringFromDate:cloudFile.startTime]]; + [self videoFormatConvertAndSave2Album:path mp4Path:mp4Path]; + }); + } break; case EZRecordDownloaderStatusMoreToken: @@ -505,6 +610,69 @@ [self.navigationController.view makeToast:[NSString stringWithFormat:@"CD Task:%lu-浠诲姟宸插湪涓嬭浇涓�", (unsigned long)task.taskID]]; } } +} + +#pragma mark 瑙嗛淇濆瓨瀹屾瘯鐨勫洖璋� +- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{ + dispatch_async(dispatch_get_main_queue(), ^{ + if (error) { + [self.navigationController.view makeToast:HDLEZLocallizedString(@"device_save_gallery_failure")]; + NSLog(@"淇濆瓨瑙嗛杩囩▼涓彂鐢熼敊璇紝閿欒淇℃伅:%@",error.localizedDescription); + NSLog(@"淇濆瓨瑙嗛杩囩▼涓彂鐢熼敊璇紝閿欒淇℃伅:%@",error); + }else{ + [self.navigationController.view makeToast:HDLEZLocallizedString(@"device_save_gallery")]; + NSLog(@"瑙嗛淇濆瓨鎴愬姛."); + } + }); +} + +/*璁块棶鐩稿唽鏉冮檺 + */ +-(void)authPhotoLibraries:(void(^)(BOOL isAblity))result { + PHAuthorizationStatus author =[PHPhotoLibrary authorizationStatus]; + if (author == PHAuthorizationStatusRestricted || author ==PHAuthorizationStatusDenied){ + if (result) { + result(NO); + } + } else if (author == PHAuthorizationStatusNotDetermined) { // 棣栨鎺堟潈 + dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + dispatch_async(queue, ^{ + [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { + if (status != PHAuthorizationStatusAuthorized) { + if (result) { + result(NO); + } + } else { + if (result) { + result(YES); + } + } + }]; + }); + } else { + if (result) { + result(YES); + } + } +} + +/*寮曞鐢ㄦ埛鎺堟潈鑾峰彇鍥剧墖 + */ +- (void)guideUserOpenAuth{ + UIAlertController *alertC = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"hdl_ez_download_tip", @"娓╅Θ鎻愮ず") message:NSLocalizedString(@"hdl_ez_download_auth", @"璇锋墦寮�璁块棶鏉冮檺") preferredStyle:(UIAlertControllerStyleAlert)]; + UIAlertAction *alertA = [UIAlertAction actionWithTitle:NSLocalizedString(@"hdl_ez_download_cancle", @"鍙栨秷") style:(UIAlertActionStyleDefault) handler:nil]; + UIAlertAction *act = [UIAlertAction actionWithTitle:NSLocalizedString(@"hdl_ez_download_toSet", @"鍘昏缃�") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { + // 寮曞鐢ㄦ埛璁剧疆 + NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; + + if ([[UIApplication sharedApplication] canOpenURL:url]) { + + [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil]; + } + }]; + [alertC addAction:alertA]; + [alertC addAction:act]; + [self presentViewController:alertC animated:YES completion:nil]; } #pragma mark - PlayerDelegate Methods @@ -559,7 +727,7 @@ NSLog(@"GetStreamFetchType:%d", [self.player getStreamFetchType]); - [self showStreamFetchType]; + // [self showStreamFetchType]; } else if (messageCode == PLAYER_PLAYBACK_STOP) { @@ -578,7 +746,7 @@ } - (void) invalidateTimer { - + if(self.playbackTimer) { [self.playbackTimer invalidate]; @@ -604,13 +772,13 @@ - (IBAction)hiddenPlayerToolbox:(id)sender { -// [UIView animateWithDuration:0.3 -// animations:^{ -// self.playerToolbox.alpha = 0.0f; -// } -// completion:^(BOOL finished) { -// _isShowToolbox = NO; -// }]; + // [UIView animateWithDuration:0.3 + // animations:^{ + // self.playerToolbox.alpha = 0.0f; + // } + // completion:^(BOOL finished) { + // _isShowToolbox = NO; + // }]; } #pragma mark - MJRefresh Methods @@ -620,7 +788,7 @@ [self.operation cancel]; [self.playbackList.header endRefreshing]; __weak __typeof(self) weakSelf = self; - + self.playbackList.header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ weakSelf.noVideoImageView.hidden = YES; weakSelf.noVideoLabel.hidden = YES; @@ -630,34 +798,35 @@ beginTime:weakSelf.beginTime endTime:weakSelf.endTime completion:^(NSArray *deviceRecords, NSError *error) { - NSLog(@"deviceRecords is %@, error is %@", deviceRecords, error); - if (!error) - { - [weakSelf.records removeAllObjects]; - if(deviceRecords.count == 0) - { - weakSelf.noVideoLabel.hidden = NO; - weakSelf.noVideoImageView.hidden = NO; - [weakSelf.playbackList reloadData]; - [weakSelf.playbackList.header endRefreshing]; - return; - } - if (deviceRecords.count > 0) - { - [weakSelf.records addObjectsFromArray:deviceRecords]; - [weakSelf.playbackList reloadData]; - [weakSelf.playbackList.header endRefreshing]; - [weakSelf doPlayback]; - } - } - else - { - [UIView dd_showMessage:[NSString stringWithFormat:@"error code is %d",(int) error.code] onParentView:self.view]; - [weakSelf.playbackList.header endRefreshing]; - [weakSelf.records removeAllObjects]; - [weakSelf.playbackList reloadData]; - } - }]; + NSLog(@"deviceRecords is %@, error is %@", deviceRecords, error); + if (!error) + { + [weakSelf.records removeAllObjects]; + if(deviceRecords.count == 0) + { + weakSelf.noVideoLabel.hidden = NO; + weakSelf.noVideoImageView.hidden = NO; + [weakSelf.playbackList reloadData]; + [weakSelf.playbackList.header endRefreshing]; + return; + } + if (deviceRecords.count > 0) + { + [weakSelf.records addObjectsFromArray:deviceRecords]; + [weakSelf.playbackList reloadData]; + [weakSelf.playbackList.header endRefreshing]; + [weakSelf doPlayback]; + } + } + else + { + NSString *mes = [NSString stringWithFormat:@"%@(%ld)",NSLocalizedString(@"setting_opration_fail", @"鎿嶄綔澶辫触"), (long)error.code]; + [UIView dd_showMessage:mes onParentView:self.view]; + [weakSelf.playbackList.header endRefreshing]; + [weakSelf.records removeAllObjects]; + [weakSelf.playbackList reloadData]; + } + }]; } else { @@ -666,36 +835,38 @@ beginTime:weakSelf.beginTime endTime:weakSelf.endTime completion:^(NSArray *cloudRecords, NSError *error) { - - NSLog(@"cloudRecords is %@, error is %@", cloudRecords, error); - if (error) - { - if (error.code > 0) { - [UIView dd_showMessage:[NSString stringWithFormat:@"error code is %d",(int) error.code] onParentView:self.view]; - } - [weakSelf.playbackList.header endRefreshing]; - [weakSelf.records removeAllObjects]; - [weakSelf.playbackList reloadData]; - return ; - } - [weakSelf.records removeAllObjects]; - if(cloudRecords.count == 0) - { - weakSelf.noVideoLabel.hidden = NO; - weakSelf.noVideoImageView.hidden = NO; - [weakSelf.playbackList reloadData]; - [weakSelf.playbackList.header endRefreshing]; - return; - } - - if (cloudRecords.count > 0) - { - [weakSelf.records addObjectsFromArray:cloudRecords]; - [weakSelf.playbackList reloadData]; - [weakSelf.playbackList.header endRefreshing]; - [weakSelf doPlayback]; - } - }]; + + NSLog(@"cloudRecords is %@, error is %@", cloudRecords, error); + if (error) + { + if (error.code > 0) { + NSString *mes = [NSString stringWithFormat:@"%@(%ld)",NSLocalizedString(@"setting_opration_fail", @"鎿嶄綔澶辫触"), (long)error.code]; + [UIView dd_showMessage:mes onParentView:self.view]; + + } + [weakSelf.playbackList.header endRefreshing]; + [weakSelf.records removeAllObjects]; + [weakSelf.playbackList reloadData]; + return ; + } + [weakSelf.records removeAllObjects]; + if(cloudRecords.count == 0) + { + weakSelf.noVideoLabel.hidden = NO; + weakSelf.noVideoImageView.hidden = NO; + [weakSelf.playbackList reloadData]; + [weakSelf.playbackList.header endRefreshing]; + return; + } + + if (cloudRecords.count > 0) + { + [weakSelf.records addObjectsFromArray:cloudRecords]; + [weakSelf.playbackList reloadData]; + [weakSelf.playbackList.header endRefreshing]; + [weakSelf doPlayback]; + } + }]; } }]; self.playbackList.header.automaticallyChangeAlpha = YES; @@ -740,14 +911,60 @@ - (IBAction)large:(id)sender { - NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft]; - [[UIDevice currentDevice] setValue:value forKey:@"orientation"]; +// NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft]; +// [[UIDevice currentDevice] setValue:value forKey:@"orientation"]; + if (_landscape == YES) { + [self largeBack:self.largeBackButton]; + return; + } + _landscape = YES; + if (@available(iOS 16.0, *)) { + if (self.navigationController) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self.navigationController setNeedsUpdateOfSupportedInterfaceOrientations]; + }); + } else { + dispatch_async(dispatch_get_main_queue(), ^{ + [self setNeedsUpdateOfSupportedInterfaceOrientations]; + }); + } + NSArray *array = [[[UIApplication sharedApplication] connectedScenes] allObjects]; + UIWindowScene *ws = (UIWindowScene *)array.firstObject; + UIWindowSceneGeometryPreferencesIOS *geometryPreferences = [[UIWindowSceneGeometryPreferencesIOS alloc] init]; + geometryPreferences.interfaceOrientations = UIInterfaceOrientationMaskLandscape; + [ws requestGeometryUpdateWithPreferences:geometryPreferences errorHandler:^(NSError * _Nonnull error) { + NSLog(@"iOS 16 Error: %@",error); + }]; + } else { + NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft]; + [[UIDevice currentDevice] setValue:value forKey:@"orientation"]; + } } - (IBAction)largeBack:(id)sender { - NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait]; - [[UIDevice currentDevice] setValue:value forKey:@"orientation"]; + _landscape = NO; + if (@available(iOS 16.0, *)) { + if (self.navigationController) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self.navigationController setNeedsUpdateOfSupportedInterfaceOrientations]; + }); + } else { + dispatch_async(dispatch_get_main_queue(), ^{ + [self setNeedsUpdateOfSupportedInterfaceOrientations]; + }); + } + NSArray *array = [[[UIApplication sharedApplication] connectedScenes] allObjects]; + UIWindowScene *ws = (UIWindowScene *)array.firstObject; + UIWindowSceneGeometryPreferencesIOS *geometryPreferences = [[UIWindowSceneGeometryPreferencesIOS alloc] init]; + geometryPreferences.interfaceOrientations = UIInterfaceOrientationMaskPortrait; + [ws requestGeometryUpdateWithPreferences:geometryPreferences errorHandler:^(NSError * _Nonnull error) { + NSLog(@"iOS 16 Error: %@",error); + }]; + } else { + NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait]; + [[UIDevice currentDevice] setValue:value forKey:@"orientation"]; + } } - (IBAction)voiceButtonClicked:(id)sender @@ -777,7 +994,7 @@ [_player setPlaybackRate:rate mode:0]; } else { - + EZPlaybackRate rate = [cloudRate[indexPath.row] intValue]; [_player setPlaybackRate:rate mode:0]; } @@ -816,7 +1033,7 @@ } - (IBAction)clickRateBtn:(UIButton *)sender { - + self.rateBtnTimer = [NSTimer scheduledTimerWithTimeInterval:2.5f target:self selector:@selector(hideRateView) userInfo:nil repeats:NO]; if(_isSelectedDevice) { @@ -888,14 +1105,14 @@ self.selectedIndexPath = nil; [UIView animateWithDuration:0.3 animations:^{ - self.selectedImageViewConstraint.constant = 0; - [self.toolView setNeedsUpdateConstraints]; - [self.toolView layoutIfNeeded]; - } + self.selectedImageViewConstraint.constant = 0; + [self.toolView setNeedsUpdateConstraints]; + [self.toolView layoutIfNeeded]; + } completion:^(BOOL finished) { - self.cloudButton.selected = YES; - self.deviceButton.selected = NO; - }]; + self.cloudButton.selected = YES; + self.deviceButton.selected = NO; + }]; _isSelectedDevice = NO; [self.records removeAllObjects]; [self.playbackList reloadData]; @@ -912,14 +1129,14 @@ self.selectedIndexPath = nil; [UIView animateWithDuration:0.3 animations:^{ - self.selectedImageViewConstraint.constant = self.view.bounds.size.width / 2.0f; - [self.toolView setNeedsUpdateConstraints]; - [self.toolView layoutIfNeeded]; - } + self.selectedImageViewConstraint.constant = self.view.bounds.size.width / 2.0f; + [self.toolView setNeedsUpdateConstraints]; + [self.toolView layoutIfNeeded]; + } completion:^(BOOL finished) { - self.cloudButton.selected = NO; - self.deviceButton.selected = YES; - }]; + self.cloudButton.selected = NO; + self.deviceButton.selected = YES; + }]; _isSelectedDevice = YES; [self.records removeAllObjects]; [self.playbackList reloadData]; @@ -983,7 +1200,7 @@ - (void)playBoxToolRefresh:(NSTimer *)timer { NSDate *currentTime = [_player getOSDTime]; -NSLog(@"getOSDTime === %@", currentTime); + NSLog(@"getOSDTime === %@", currentTime); if(_isSelectedDevice) { _playSeconds = [currentTime timeIntervalSinceDate:_deviceRecord.startTime]; @@ -992,7 +1209,7 @@ { _playSeconds = [currentTime timeIntervalSinceDate:_cloudRecord.startTime]; } - + if(_playSeconds >= 3600) { int hour = (int)_playSeconds / 3600; @@ -1100,19 +1317,19 @@ - (void)streamPlayer:(EZStreamPlayer *)player didReceivedMessage:(EZStreamPlayerMsgType)msgType { dispatch_async(dispatch_get_main_queue(), ^{ - + NSString *msg; switch (msgType) { case EZStreamPlayerMsgTypeRealPlayStart: msg = @"寮�鍚瑙堟垚鍔�"; break; - case EZStreamPlayerMsgTypeRealPlayClose: + case EZStreamPlayerMsgTypeRealPlayClose: msg = @"鍏抽棴棰勮鎴愬姛"; break; - case EZStreamPlayerMsgTypePlayBackStart: + case EZStreamPlayerMsgTypePlayBackStart: msg = @"寮�鍚澶囧洖鏀炬垚鍔�"; break; - case EZStreamPlayerMsgTypePlayBackClose: + case EZStreamPlayerMsgTypePlayBackClose: msg = @"鍏抽棴璁惧鍥炴斁鎴愬姛"; break; default: @@ -1126,14 +1343,14 @@ { if (dataType == EZStreamDataTypeHeader) { dispatch_async(dispatch_get_main_queue(), ^{ - + [self.navigationController.view makeToast:@"寮�濮嬪啓鍏ユ枃浠�"]; }); } else if (dataType == EZStreamDataTypeStreamEnd) { dispatch_async(dispatch_get_main_queue(), ^{ - + self.streamPlayBtn.selected = NO; }); @@ -1143,4 +1360,8 @@ } } +- (BOOL)prefersHomeIndicatorAutoHidden { + return YES; +} + @end -- Gitblit v1.8.0