完成ios基本功能

This commit is contained in:
zher52 2021-10-10 08:23:59 +08:00
parent 4517f62403
commit 586ae7d4fe
6 changed files with 159 additions and 31 deletions

View File

@ -46,6 +46,8 @@
<source-file src="src/ios/SGRecord/SGRecordEncoder.m"/>
<header-file src="src/ios/SGRecord/SGRecordManager.h"/>
<source-file src="src/ios/SGRecord/SGRecordManager.m"/>
<header-file src="src/ios/SGRecord/SGRecordOptions.h"/>
<source-file src="src/ios/SGRecord/SGRecordOptions.m"/>
<header-file src="src/ios/SGRecord/SGRecordProgressView.h"/>
<source-file src="src/ios/SGRecord/SGRecordProgressView.m"/>
<header-file src="src/ios/SGRecord/SGRecordSuccessPreview.h"/>

View File

@ -538,7 +538,7 @@ typedef void(^PropertyChangeBlock)(AVCaptureDevice *captureDevice);
- (NSString *)getUploadFile_type:(NSString *)type fileType:(NSString *)fileType {
NSTimeInterval now = [[NSDate date] timeIntervalSince1970];
NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"HHmmss"];
[formatter setDateFormat:@"yyyyMMddHHmmss"];
NSDate * NowDate = [NSDate dateWithTimeIntervalSince1970:now];
;
NSString * timeStr = [formatter stringFromDate:NowDate];

View File

@ -0,0 +1,29 @@
//
// Created by 范大德 on 2021/10/9.
//
#import <Foundation/Foundation.h>
@protocol CDVCommandDelegate;
@interface SGRecordOptions : NSObject
@property (nonatomic, weak) id <CDVCommandDelegate> commandDelegate;
@property (strong) NSString* callbackId;
@property (strong) NSNumber* quality;
@property (assign) UIImagePickerControllerSourceType sourceType;
@property (assign) CGSize targetSize;
@property (assign) BOOL allowsEditing;
@property (assign) BOOL correctOrientation;
@property (assign) BOOL saveToPhotoAlbum;
@property (strong) NSDictionary* popoverOptions;
@property (assign) UIImagePickerControllerCameraDevice cameraDirection;
@property (assign) BOOL popoverSupported;
@property (assign) BOOL usesGeolocation;
@property (assign) BOOL cropToSize;
+ (instancetype) createFromArguments:(CDVInvokedUrlCommand*)command;
@end

View File

@ -0,0 +1,38 @@
//
// Created by on 2021/10/9.
//
#import <Cordova/CDVInvokedUrlCommand.h>
#import <Cordova/CDVCommandDelegate.h>
#import "SGRecordOptions.h"
@implementation SGRecordOptions
+ (instancetype) createFromArguments:(CDVInvokedUrlCommand*)command
{
SGRecordOptions* options = [[SGRecordOptions alloc] init];
options.callbackId = command.callbackId;
options.quality = [command argumentAtIndex:0 withDefault:@(50)];
options.sourceType = [[command argumentAtIndex:2 withDefault:@(UIImagePickerControllerSourceTypeCamera)] unsignedIntegerValue];
NSNumber* targetWidth = [command argumentAtIndex:3 withDefault:nil];
NSNumber* targetHeight = [command argumentAtIndex:4 withDefault:nil];
options.targetSize = CGSizeMake(0, 0);
if ((targetWidth != nil) && (targetHeight != nil)) {
options.targetSize = CGSizeMake([targetWidth floatValue], [targetHeight floatValue]);
}
options.allowsEditing = [[command argumentAtIndex:7 withDefault:@(NO)] boolValue];
options.correctOrientation = [[command argumentAtIndex:8 withDefault:@(NO)] boolValue];
options.saveToPhotoAlbum = [[command argumentAtIndex:9 withDefault:@(NO)] boolValue];
options.popoverOptions = [command argumentAtIndex:10 withDefault:nil];
options.cameraDirection = [[command argumentAtIndex:11 withDefault:@(UIImagePickerControllerCameraDeviceRear)] unsignedIntegerValue];
options.popoverSupported = NO;
options.usesGeolocation = NO;
return options;
}
@end

View File

@ -8,6 +8,10 @@
#import <UIKit/UIKit.h>
@interface SGRecordViewController : UIViewController
@protocol CDVCommandDelegate;
@class SGRecordOptions;
@interface SGRecordViewController : UIViewController
@property SGRecordOptions* options;
+ (instancetype) createFromOption:(SGRecordOptions*)options;
@end

View File

@ -8,10 +8,14 @@
#import "SGRecordViewController.h"
#import <MobileCoreServices/MobileCoreServices.h>
#import <Cordova/CDVCommandDelegate.h>
#import <Cordova/CDVPluginResult.h>
#import "SGRecordManager.h"
#import "SGRecordSuccessPreview.h"
#import "SGRecordProgressView.h"
#import "UIButton+Convenience.h"
#import "SGRecordOptions.h"
#import "SGRecordOptions.h"
#import "SGMotionManager.h"
#define WEAKSELF __weak typeof(self) weakSelf = self;
#define STRONGSELF __strong typeof(weakSelf) strongSelf = weakSelf;
@ -30,8 +34,10 @@
@property (nonatomic ,strong) UILabel *tipLabel;//
@property (nonatomic ,strong) UIButton *exitButton;// 退
@property (nonatomic ,strong) UIButton *switchButton;//
@property (nonatomic ,strong) UIButton *torchButton;//
@property (nonatomic ,assign) UIDeviceOrientation lastDeviceOrientation;//
@property (nonatomic ,strong) UILabel *alartLabel;// (),3s
@property (nonatomic ,strong) UILabel *alertLabel;// (),3s
@end
@implementation SGRecordViewController
@ -73,6 +79,8 @@
[self.recordManger shutdown];
}
- (void)exitRecordController{
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
[[self options].commandDelegate sendPluginResult:pluginResult callbackId:self.options.callbackId];
[self dismissViewControllerAnimated:YES completion:nil];
}
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_8_4
@ -81,6 +89,12 @@
}
#endif
+ (instancetype) createFromOption:(SGRecordOptions*)options{
SGRecordViewController* view = [[SGRecordViewController alloc] init];
view.options = options;
return view;
}
#pragma mark -
#pragma mark -
- (void)takephoto{
@ -127,6 +141,9 @@
//
- (void)sendWithImage:(UIImage *)image videoPath:(NSString *)videoPath{
NSLog(@"发送");
//
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString: videoPath];
[[self options].commandDelegate sendPluginResult:pluginResult callbackId:self.options.callbackId];
[self exitRecordController];
}
//
@ -141,6 +158,7 @@
[self showAllOperationViews];
[self.recordManger startUp];
}
#pragma mark -
#pragma mark - setget
- (SGRecordManager *)recordManger {
@ -180,22 +198,22 @@
}
return _preview;
}
- (UILabel *)alartLabel{
if (!_alartLabel) {
_alartLabel = [[UILabel alloc]init];
_alartLabel.text = @"拍摄时间太短,不少于3s";
_alartLabel.font = [UIFont systemFontOfSize:15];
_alartLabel.textColor = [UIColor whiteColor];
_alartLabel.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.6];
_alartLabel.textAlignment = NSTextAlignmentCenter;
_alartLabel.layer.cornerRadius = 19;
_alartLabel.clipsToBounds = YES;
CGFloat width = [_alartLabel.text boundingRectWithSize:CGSizeMake(MAXFLOAT, 76/2) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15]} context:nil].size.width;
_alartLabel.bounds = CGRectMake(0, 0, width + 30, 76/2);
_alartLabel.center = CGPointMake(self.view.center.x, _tipLabel.center.y - _tipLabel.bounds.size.height/2 - 48/2 - _tipLabel.bounds.size.height/2);
[self.view addSubview:_alartLabel];
- (UILabel *)alertLabel{
if (!_alertLabel) {
_alertLabel = [[UILabel alloc]init];
_alertLabel.text = @"拍摄时间太短,不少于3s";
_alertLabel.font = [UIFont systemFontOfSize:15];
_alertLabel.textColor = [UIColor whiteColor];
_alertLabel.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.6];
_alertLabel.textAlignment = NSTextAlignmentCenter;
_alertLabel.layer.cornerRadius = 19;
_alertLabel.clipsToBounds = YES;
CGFloat width = [_alertLabel.text boundingRectWithSize:CGSizeMake(MAXFLOAT, 76/2) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15]} context:nil].size.width;
_alertLabel.bounds = CGRectMake(0, 0, width + 30, 76/2);
_alertLabel.center = CGPointMake(self.view.center.x, _tipLabel.center.y - _tipLabel.bounds.size.height/2 - 48/2 - _tipLabel.bounds.size.height/2);
[self.view addSubview:_alertLabel];
}
return _alartLabel;
return _alertLabel;
}
#pragma mark -
#pragma mark -Set Up UI
@ -219,7 +237,9 @@
UILabel *tipLabel = [[UILabel alloc]init];
tipLabel.bounds = CGRectMake(0, 0, 200, 20);
tipLabel.center = CGPointMake(self.view.center.x, self.view.bounds.size.height - 160 - 13/2);
tipLabel.text = @"点击拍照,长按拍摄";
//
// tipLabel.text = @"点击拍照,长按拍摄";
tipLabel.text = @"";
tipLabel.font = [UIFont systemFontOfSize:13];
tipLabel.textAlignment = NSTextAlignmentCenter;
tipLabel.textColor = [UIColor whiteColor];
@ -232,6 +252,15 @@
[self.view addSubview:switchButton];
_switchButton = switchButton;
//
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if ([device hasTorch] && [device hasFlash]) {
UIButton *torchButton = [UIButton image:@"btn_video_flash_open"target:self action:@selector(torchButtonPressed:)];
torchButton.frame = CGRectMake(self.view.bounds.size.width - (44 - 5) * 3 , 10, 44, 44);
[self.view addSubview:torchButton];
_torchButton = torchButton;
}
//
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGesture:)];
tapGesture.delegate = self;
@ -269,6 +298,24 @@
button.selected = !button.selected;
[self.recordManger changeCameraInputDeviceisFront:button.selected];
}
//
- (void)torchButtonPressed:(id)sender
{
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error;
BOOL b = [device lockForConfiguration:&error];
if (!b) {
if (error) {
NSLog(@"lock torch configuration error:%@", error.localizedDescription);
}
return;
}
device.torchMode =
(device.torchMode == AVCaptureTorchModeOff ? AVCaptureTorchModeOn : AVCaptureTorchModeOff);
[device unlockForConfiguration];
}
#pragma mark -
#pragma mark -
//
@ -278,6 +325,7 @@
[self.exitButton setHidden:NO];
[self.tipLabel setHidden:NO];
[self.switchButton setHidden:NO];
[self.torchButton setHidden:NO];
});
}
//
@ -287,6 +335,7 @@
[self.exitButton setHidden:YES];
[self.tipLabel setHidden:YES];
[self.switchButton setHidden:YES];
[self.torchButton setHidden:YES];
});
}
// 退
@ -294,6 +343,7 @@
dispatch_async(dispatch_get_main_queue(), ^{
[self.exitButton setHidden:NO];
[self.switchButton setHidden:NO];
[self.torchButton setHidden:NO];
});
}
// 退
@ -301,6 +351,7 @@
dispatch_async(dispatch_get_main_queue(), ^{
[self.exitButton setHidden:YES];
[self.switchButton setHidden:YES];
[self.torchButton setHidden:YES];
});
}
#pragma mark -
@ -333,14 +384,18 @@
//
NSLog(@"录制时间太短");
[self stopRecord:NO];
[self alart];//
[self alert];//
[self.recordButton resetScale];
} else if (_timeInterval < RECORD_TIME) {
//
NSLog(@"拍照");
[self.recordButton setEnabled:NO];
[self hideAllOperationViews];
[self takephoto];
//
// NSLog(@"拍照");
// [self.recordButton setEnabled:NO];
// [self hideAllOperationViews];
// [self takephoto];
NSLog(@"录制时间太短");
[self stopRecord:NO];
[self alert];//
[self.recordButton resetScale];
} else {
//
NSLog(@"结束录制");
@ -438,15 +493,15 @@
_lastDeviceOrientation = deviceOrientation;
NSLog(@"deviceOrientation:%ld",(long)deviceOrientation);
}
- (void)alart{
[self.view bringSubviewToFront:self.alartLabel];
- (void)alert{
[self.view bringSubviewToFront:self.alertLabel];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (_alartLabel) {
if (_alertLabel) {
[UIView animateWithDuration:0.25 animations:^{
_alartLabel.alpha = 0;
_alertLabel.alpha = 0;
} completion:^(BOOL finished) {
[_alartLabel removeFromSuperview];
_alartLabel = nil;
[_alertLabel removeFromSuperview];
_alertLabel = nil;
}];
}
});