diff --git a/DDCameraViewController.podspec b/DDCameraViewController.podspec index c71624d..1c4d145 100644 --- a/DDCameraViewController.podspec +++ b/DDCameraViewController.podspec @@ -14,7 +14,7 @@ Pod::Spec.new do |s| s.homepage = 'http://dashdevs.com' s.license = { :type => 'MIT', :file => 'LICENSE' } s.author = { 'dashdevs llc' => 'hello@dashdevs.com' } - s.source = { :git => 'https://bitbucket.org/itomych/DDCameraViewController.git', :tag => s.version.to_s } + s.source = { :git => 'https://github.com/dashdevs/DDCameraViewController.git', :tag => s.version.to_s } s.ios.deployment_target = '9.0' @@ -52,6 +52,13 @@ Pod::Spec.new do |s| subspec.dependency 'DDCameraViewController/DDCaptureStillImageOutput' end + s.subspec 'DDScannerViewController' do |subspec| + subspec.source_files = 'DDCameraViewController/Classes/DDScannerViewController.{h,m}' + subspec.public_header_files = 'DDCameraViewController/Classes/DDScannerViewController.h' + subspec.ios.deployment_target = '9.0' + subspec.dependency 'DDCameraViewController/DDCameraViewController' + end + s.subspec 'DDCaptureDeviceInputSwitch' do |subspec| subspec.source_files = 'DDCameraViewController/Classes/AVCaptureDevice+DDCaptureDevicePosition.{h,m}', 'DDCameraViewController/Classes/DDCameraViewController+DDCaptureDeviceInputSwitch.{h,m}' diff --git a/DDCameraViewController/Classes/DDCameraViewController.m b/DDCameraViewController/Classes/DDCameraViewController.m index 244648c..f19665e 100644 --- a/DDCameraViewController/Classes/DDCameraViewController.m +++ b/DDCameraViewController/Classes/DDCameraViewController.m @@ -8,15 +8,6 @@ #import "DDCameraViewController.h" #import "DDCameraViewController_Private.h" -static dispatch_queue_t dd_capture_session_queue() { - static dispatch_queue_t capture_session_queue; - static dispatch_once_t onceToken = 0; - dispatch_once(&onceToken, ^{ - capture_session_queue = dispatch_queue_create("com.dashdevs.capture.session", DISPATCH_QUEUE_SERIAL); - }); - return capture_session_queue; -} - NSString *const DDCameraViewControllerErrorDomain = @"DDCameraViewControllerErrorDomain"; @implementation DDCameraViewController diff --git a/DDCameraViewController/Classes/DDCameraViewController_Private.h b/DDCameraViewController/Classes/DDCameraViewController_Private.h index af8a5d5..082f244 100644 --- a/DDCameraViewController/Classes/DDCameraViewController_Private.h +++ b/DDCameraViewController/Classes/DDCameraViewController_Private.h @@ -9,6 +9,15 @@ NS_ASSUME_NONNULL_BEGIN +static dispatch_queue_t dd_capture_session_queue() { + static dispatch_queue_t capture_session_queue; + static dispatch_once_t onceToken = 0; + dispatch_once(&onceToken, ^{ + capture_session_queue = dispatch_queue_create("com.dashdevs.capture.session", DISPATCH_QUEUE_SERIAL); + }); + return capture_session_queue; +} + @interface DDCameraViewController () @property (nonatomic, strong, readwrite, nullable) AVCaptureSession *captureSession; diff --git a/DDCameraViewController/Classes/DDScannerViewController.h b/DDCameraViewController/Classes/DDScannerViewController.h new file mode 100644 index 0000000..933e36b --- /dev/null +++ b/DDCameraViewController/Classes/DDScannerViewController.h @@ -0,0 +1,45 @@ +// +// DDScannerViewController.h +// DDCameraViewController +// +// Copyright (c) 2020 dashdevs.com. All rights reserved. +// + +#import "DDCameraViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol DDScannerViewControllerDelegate; + +/** + Camera view subclass that allows to scanned + */ +@interface DDScannerViewController: DDCameraViewController + +/** + Delegate object that will receive events from code view controller + */ +@property (weak, nonatomic, nullable) id delegate; + +/** + Adds the ability to set possible scan types. + + @param types The value of this property is an NSArray of NSStrings corresponding to AVMetadataObjectType strings defined in AVMetadataObject.h -- one for each metadata object type supported by the receiver. Clients may specify the types of objects they would like to process by calling setMetadataObjectTypes:. + */ +- (void)setMetadataObjectTypes:(NSArray * _Nullable)types; + +@end + +@protocol DDScannerViewControllerDelegate + +/** + Sent to the delegate object after scanning. + + @param controller View controller object that initiated the request. + @param code The scanned information is sent as a string to the delegate object. + */ +- (void)scannerViewController:(DDScannerViewController *)controller didScanMachineReadableCode:(NSString * _Nullable)code; + +@end + +NS_ASSUME_NONNULL_END diff --git a/DDCameraViewController/Classes/DDScannerViewController.m b/DDCameraViewController/Classes/DDScannerViewController.m new file mode 100644 index 0000000..794ffe9 --- /dev/null +++ b/DDCameraViewController/Classes/DDScannerViewController.m @@ -0,0 +1,52 @@ +// +// DDScannerViewController.m +// DDCameraViewController +// +// Copyright (c) 2020 dashdevs.com. All rights reserved. +// + +#import "DDScannerViewController.h" +#import "DDCameraViewController_Private.h" + +@interface DDScannerViewController () +@property (strong, nonatomic, nullable) NSArray *scannerMetadataObjectTypes; +@property (strong, nonatomic, nullable) NSString *machineReadableCode; +@property (strong, nonatomic, nullable) AVCaptureMetadataOutput *output; +@end + +@implementation DDScannerViewController + +- (void)initializeCaptureSession { + [super initializeCaptureSession]; + _output = [[AVCaptureMetadataOutput alloc] init]; + [self.captureSession addOutput:self.output]; + [self.output setMetadataObjectsDelegate:self queue:dd_capture_session_queue()]; + [self setMetadataObjectTypes:nil]; +} + +- (void)setMetadataObjectTypes:(NSArray * _Nullable)types { + self.scannerMetadataObjectTypes = types; + NSSet *set = [NSSet setWithArray:self.scannerMetadataObjectTypes]; + NSMutableSet *available = [NSMutableSet setWithArray:[self.output availableMetadataObjectTypes]]; + [available intersectSet:set]; + [self.output setMetadataObjectTypes:available.allObjects]; +} + +- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { + for (AVMetadataObject *current in metadataObjects) { + if ([current isKindOfClass:[AVMetadataMachineReadableCodeObject class]] + && [self.scannerMetadataObjectTypes containsObject:current.type]) { + NSString *code = [(AVMetadataMachineReadableCodeObject *)current stringValue]; + if ([self.delegate respondsToSelector:@selector(scannerViewController:didScanMachineReadableCode:)] + && ![code isEqualToString:self.machineReadableCode]) { + self.machineReadableCode = code; + dispatch_async(dispatch_get_main_queue(), ^(void){ + [self.delegate scannerViewController:self didScanMachineReadableCode:code]; + }); + } + break; + } + } +} + +@end diff --git a/Example/DDCameraViewController.xcodeproj/project.pbxproj b/Example/DDCameraViewController.xcodeproj/project.pbxproj index 7440be6..e7f1c79 100644 --- a/Example/DDCameraViewController.xcodeproj/project.pbxproj +++ b/Example/DDCameraViewController.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 1063A273245AE694007EB6F3 /* DDViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1063A272245AE694007EB6F3 /* DDViewController.m */; }; + 10D16D5C2456FEAB0049218E /* DDScannerCameraViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 10D16D5B2456FEAB0049218E /* DDScannerCameraViewController.m */; }; 5DCA21F76EEDC8B7EE91D784 /* Pods_DDCameraViewController_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 128F4D521EEF06DF99397F0A /* Pods_DDCameraViewController_Example.framework */; }; 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58F195388D20070C39A /* CoreGraphics.framework */; }; @@ -14,7 +16,7 @@ 6003F598195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F596195388D20070C39A /* InfoPlist.strings */; }; 6003F59A195388D20070C39A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F599195388D20070C39A /* main.m */; }; 6003F59E195388D20070C39A /* DDAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F59D195388D20070C39A /* DDAppDelegate.m */; }; - 6003F5A7195388D20070C39A /* DDViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5A6195388D20070C39A /* DDViewController.m */; }; + 6003F5A7195388D20070C39A /* DDCustomCameraViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5A6195388D20070C39A /* DDCustomCameraViewController.m */; }; 6003F5A9195388D20070C39A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5A8195388D20070C39A /* Images.xcassets */; }; 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F5AF195388D20070C39A /* XCTest.framework */; }; 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; @@ -43,6 +45,11 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 1063A271245AE694007EB6F3 /* DDViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DDViewController.h; sourceTree = ""; }; + 1063A272245AE694007EB6F3 /* DDViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DDViewController.m; sourceTree = ""; }; + 107F67562460100500EF7EDC /* DDCameraHints.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DDCameraHints.h; sourceTree = ""; }; + 10D16D5A2456FEAB0049218E /* DDScannerCameraViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DDScannerCameraViewController.h; sourceTree = ""; }; + 10D16D5B2456FEAB0049218E /* DDScannerCameraViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DDScannerCameraViewController.m; sourceTree = ""; }; 128F4D521EEF06DF99397F0A /* Pods_DDCameraViewController_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_DDCameraViewController_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1EFDFE4191BDB8C3BEB1AC8C /* TODO.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = TODO.md; path = ../TODO.md; sourceTree = ""; }; 6003F58A195388D20070C39A /* DDCameraViewController_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DDCameraViewController_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -55,8 +62,8 @@ 6003F59B195388D20070C39A /* DDCameraViewController-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DDCameraViewController-Prefix.pch"; sourceTree = ""; }; 6003F59C195388D20070C39A /* DDAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DDAppDelegate.h; sourceTree = ""; }; 6003F59D195388D20070C39A /* DDAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DDAppDelegate.m; sourceTree = ""; }; - 6003F5A5195388D20070C39A /* DDViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DDViewController.h; sourceTree = ""; }; - 6003F5A6195388D20070C39A /* DDViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DDViewController.m; sourceTree = ""; }; + 6003F5A5195388D20070C39A /* DDCustomCameraViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DDCustomCameraViewController.h; sourceTree = ""; }; + 6003F5A6195388D20070C39A /* DDCustomCameraViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DDCustomCameraViewController.m; sourceTree = ""; }; 6003F5A8195388D20070C39A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 6003F5AE195388D20070C39A /* DDCameraViewController_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DDCameraViewController_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 6003F5AF195388D20070C39A /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; @@ -151,8 +158,13 @@ 6003F59C195388D20070C39A /* DDAppDelegate.h */, 6003F59D195388D20070C39A /* DDAppDelegate.m */, 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */, - 6003F5A5195388D20070C39A /* DDViewController.h */, - 6003F5A6195388D20070C39A /* DDViewController.m */, + 107F67562460100500EF7EDC /* DDCameraHints.h */, + 1063A271245AE694007EB6F3 /* DDViewController.h */, + 1063A272245AE694007EB6F3 /* DDViewController.m */, + 6003F5A5195388D20070C39A /* DDCustomCameraViewController.h */, + 6003F5A6195388D20070C39A /* DDCustomCameraViewController.m */, + 10D16D5A2456FEAB0049218E /* DDScannerCameraViewController.h */, + 10D16D5B2456FEAB0049218E /* DDScannerCameraViewController.m */, 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */, 6003F5A8195388D20070C39A /* Images.xcassets */, 6003F594195388D20070C39A /* Supporting Files */, @@ -402,7 +414,9 @@ buildActionMask = 2147483647; files = ( 6003F59E195388D20070C39A /* DDAppDelegate.m in Sources */, - 6003F5A7195388D20070C39A /* DDViewController.m in Sources */, + 10D16D5C2456FEAB0049218E /* DDScannerCameraViewController.m in Sources */, + 6003F5A7195388D20070C39A /* DDCustomCameraViewController.m in Sources */, + 1063A273245AE694007EB6F3 /* DDViewController.m in Sources */, 6003F59A195388D20070C39A /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Example/DDCameraViewController/Base.lproj/Main.storyboard b/Example/DDCameraViewController/Base.lproj/Main.storyboard index e54725d..39091b1 100644 --- a/Example/DDCameraViewController/Base.lproj/Main.storyboard +++ b/Example/DDCameraViewController/Base.lproj/Main.storyboard @@ -1,18 +1,77 @@ - - - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -28,10 +87,10 @@ - + - + + @@ -111,7 +171,110 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/DDCameraViewController/DDCameraHints.h b/Example/DDCameraViewController/DDCameraHints.h new file mode 100644 index 0000000..74187c8 --- /dev/null +++ b/Example/DDCameraViewController/DDCameraHints.h @@ -0,0 +1,24 @@ +// +// DDCameraHints.h +// DDCameraViewController +// +// Copyright (c) 2019 dashdevs.com. All rights reserved. +// + +NS_INLINE NSString* DDDeviceFlashModeHintText(AVCaptureFlashMode mode) { + switch (mode) { + case AVCaptureFlashModeOff: return NSLocalizedString(@"Flash off", nil); + case AVCaptureFlashModeOn: return NSLocalizedString(@"Flash on", nil); + case AVCaptureFlashModeAuto: return NSLocalizedString(@"Flash auto", nil); + default: return NSLocalizedString(@"Flash not found", nil); + } +}; + +NS_INLINE NSString* DDDeviceTorchModeHintText(AVCaptureTorchMode mode) { + switch (mode) { + case AVCaptureTorchModeOff: return NSLocalizedString(@"Torch off", nil); + case AVCaptureTorchModeOn: return NSLocalizedString(@"Torch on", nil); + case AVCaptureTorchModeAuto: return NSLocalizedString(@"Torch auto", nil); + default: return NSLocalizedString(@"Torch not found", nil); + } +}; diff --git a/Example/DDCameraViewController/DDCustomCameraViewController.h b/Example/DDCameraViewController/DDCustomCameraViewController.h new file mode 100644 index 0000000..97f8fa3 --- /dev/null +++ b/Example/DDCameraViewController/DDCustomCameraViewController.h @@ -0,0 +1,14 @@ +// +// DDCustomCameraViewController.h +// DDCameraViewController +// +// Copyright (c) 2019 dashdevs.com. All rights reserved. +// + +@import UIKit; + +#import "DDStillImageViewController.h" + +@interface DDCustomCameraViewController : DDStillImageViewController + +@end diff --git a/Example/DDCameraViewController/DDCustomCameraViewController.m b/Example/DDCameraViewController/DDCustomCameraViewController.m new file mode 100644 index 0000000..1800464 --- /dev/null +++ b/Example/DDCameraViewController/DDCustomCameraViewController.m @@ -0,0 +1,61 @@ +// +// DDCustomCameraViewController.m +// DDCameraViewController +// +// Copyright (c) 2019 dashdevs.com. All rights reserved. +// + +#import "DDCustomCameraViewController.h" +#import "AVCaptureDevice+DDCaptureDeviceModesSwitch.h" +#import "DDCameraViewController+DDCaptureDeviceInputSwitch.h" +#import "DDCameraHints.h" + +@interface DDCustomCameraViewController () +@property (weak, nonatomic) IBOutlet UIImageView *imageView; +@property (weak, nonatomic) IBOutlet UILabel *flashModeLabel; +@property (weak, nonatomic) IBOutlet UILabel *torchModeLabel; + +@end + +@implementation DDCustomCameraViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.delegate = self; + [self updateHints]; +} + +- (IBAction)switchCameraButtonTapped:(UIButton*)sender { + [self switchCaptureDeviceInputWithError:nil]; +} + +- (IBAction)switchFlashButtonTapped:(UIButton*)sender { + [self.captureDevice dd_switchFlashMode:nil]; + [self updateHints]; +} + +- (IBAction)switchTorchButtonTapped:(UIButton*)sender { + [self.captureDevice dd_switchTorchMode:nil]; + [self updateHints]; +} + +- (IBAction)takePhotoButtonTapped:(UIButton*)sender { + [super takePhotoAction:nil]; +} + +- (void)updateHints { + self.flashModeLabel.text = DDDeviceFlashModeHintText(self.captureDevice.flashMode); + self.torchModeLabel.text = DDDeviceTorchModeHintText(self.captureDevice.torchMode); +} + +#pragma mark - DDStillImageViewControllerDelegate + +- (void)stillImageViewController:(DDStillImageViewController *)controller didFailWithError:(NSError *)error { + NSLog(@"Failed to take a photo with error: %@", error.localizedDescription); +} + +- (void)stillImageViewController:(DDStillImageViewController *)controller didTakePhoto:(UIImage *)photo { + self.imageView.image = photo; +} + +@end diff --git a/Example/DDCameraViewController/DDScannerCameraViewController.h b/Example/DDCameraViewController/DDScannerCameraViewController.h new file mode 100644 index 0000000..d6a7275 --- /dev/null +++ b/Example/DDCameraViewController/DDScannerCameraViewController.h @@ -0,0 +1,26 @@ +// +// DDScannerCameraViewController.h +// DDCameraViewController +// +// Copyright (c) 2020 dashdevs.com. All rights reserved. +// + +#import "DDScannerViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol DDScannerCameraViewControllerDelegate; + +@interface DDScannerCameraViewController : DDScannerViewController + +@property (weak, nonatomic, nullable) id scannerDelegate; + +@end + +@protocol DDScannerCameraViewControllerDelegate + +- (void)scannerCameraViewController:(DDScannerCameraViewController *)controller didScanMachineReadableCode:(NSString * _Nullable)code; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Example/DDCameraViewController/DDScannerCameraViewController.m b/Example/DDCameraViewController/DDScannerCameraViewController.m new file mode 100644 index 0000000..352e906 --- /dev/null +++ b/Example/DDCameraViewController/DDScannerCameraViewController.m @@ -0,0 +1,76 @@ +// +// DDScannerCameraViewController.m +// DDCameraViewController +// +// Copyright (c) 2020 dashdevs.com. All rights reserved. +// + +#import "DDScannerCameraViewController.h" +#import "AVCaptureDevice+DDCaptureDeviceModesSwitch.h" +#import "DDCameraViewController+DDCaptureDeviceInputSwitch.h" +#import "DDCameraHints.h" + +@interface DDScannerCameraViewController () +@property (weak, nonatomic) IBOutlet UILabel *flashModeLabel; +@property (weak, nonatomic) IBOutlet UILabel *torchModeLabel; +@end + +@implementation DDScannerCameraViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.delegate = self; + [self updateHints]; +} + +- (void)setMetadataObjectTypes:(NSArray *)types { + [super setMetadataObjectTypes:@[AVMetadataObjectTypeUPCECode, + AVMetadataObjectTypeCode39Code, + AVMetadataObjectTypeCode39Mod43Code, + AVMetadataObjectTypeEAN13Code, + AVMetadataObjectTypeEAN8Code, + AVMetadataObjectTypeCode93Code, + AVMetadataObjectTypeCode128Code, + AVMetadataObjectTypePDF417Code, + AVMetadataObjectTypeQRCode, + AVMetadataObjectTypeAztecCode, + AVMetadataObjectTypeInterleaved2of5Code, + AVMetadataObjectTypeITF14Code, + AVMetadataObjectTypeDataMatrixCode]]; +} + +- (IBAction)cancelButtonTapped:(UIButton *)sender { + [self dismissViewControllerAnimated:YES completion:NULL]; +} + +- (IBAction)switchCameraButtonTapped:(UIButton*)sender { + [self switchCaptureDeviceInputWithError:nil]; +} + +- (IBAction)switchFlashButtonTapped:(UIButton*)sender { + [self.captureDevice dd_switchFlashMode:nil]; + [self updateHints]; +} + +- (IBAction)switchTorchButtonTapped:(UIButton*)sender { + [self.captureDevice dd_switchTorchMode:nil]; + [self updateHints]; +} + +- (void)updateHints { + self.flashModeLabel.text = DDDeviceFlashModeHintText(self.captureDevice.flashMode); + self.torchModeLabel.text = DDDeviceTorchModeHintText(self.captureDevice.torchMode); +} + +#pragma mark - DDScannerViewControllerDelegate + +- (void)scannerViewController:(DDScannerViewController *)controller didScanMachineReadableCode:(NSString * _Nullable)code { + [self dismissViewControllerAnimated:YES completion:^{ + if ([self.scannerDelegate respondsToSelector:@selector(scannerCameraViewController:didScanMachineReadableCode:)]) { + [self.captureSession stopRunning]; + [self.scannerDelegate scannerCameraViewController:self didScanMachineReadableCode:code]; + } + }]; +} + +@end diff --git a/Example/DDCameraViewController/DDViewController.h b/Example/DDCameraViewController/DDViewController.h index 4abe78a..3d1a759 100644 --- a/Example/DDCameraViewController/DDViewController.h +++ b/Example/DDCameraViewController/DDViewController.h @@ -7,8 +7,6 @@ @import UIKit; -#import "DDStillImageViewController.h" - -@interface DDViewController : DDStillImageViewController +@interface DDViewController : UIViewController @end diff --git a/Example/DDCameraViewController/DDViewController.m b/Example/DDCameraViewController/DDViewController.m index 025ec6f..a719ced 100644 --- a/Example/DDCameraViewController/DDViewController.m +++ b/Example/DDCameraViewController/DDViewController.m @@ -6,73 +6,25 @@ // #import "DDViewController.h" -#import "AVCaptureDevice+DDCaptureDeviceModesSwitch.h" -#import "DDCameraViewController+DDCaptureDeviceInputSwitch.h" - -NS_INLINE NSString* DDDeviceFlashModeHintText(AVCaptureFlashMode mode) { - switch (mode) { - case AVCaptureFlashModeOff: return NSLocalizedString(@"Flash off", nil); - case AVCaptureFlashModeOn: return NSLocalizedString(@"Flash on", nil); - case AVCaptureFlashModeAuto: return NSLocalizedString(@"Flash auto", nil); - default: return NSLocalizedString(@"Flash not found", nil); - } -}; - -NS_INLINE NSString* DDDeviceTorchModeHintText(AVCaptureTorchMode mode) { - switch (mode) { - case AVCaptureTorchModeOff: return NSLocalizedString(@"Torch off", nil); - case AVCaptureTorchModeOn: return NSLocalizedString(@"Torch on", nil); - case AVCaptureTorchModeAuto: return NSLocalizedString(@"Torch auto", nil); - default: return NSLocalizedString(@"Torch not found", nil); - } -}; - -@interface DDViewController () -@property (weak, nonatomic) IBOutlet UIImageView *imageView; -@property (weak, nonatomic) IBOutlet UILabel *flashModeLabel; -@property (weak, nonatomic) IBOutlet UILabel *torchModeLabel; +#import "DDScannerCameraViewController.h" +@interface DDViewController () @end @implementation DDViewController -- (void)viewDidLoad { - [super viewDidLoad]; - self.delegate = self; - [self updateHints]; -} - -- (IBAction)switchCameraButtonTapped:(UIButton*)sender { - [self switchCaptureDeviceInputWithError:nil]; -} - -- (IBAction)switchFlashButtonTapped:(UIButton*)sender { - [self.captureDevice dd_switchFlashMode:nil]; - [self updateHints]; -} - -- (IBAction)switchTorchButtonTapped:(UIButton*)sender { - [self.captureDevice dd_switchTorchMode:nil]; - [self updateHints]; -} - -- (IBAction)takePhotoButtonTapped:(UIButton*)sender { - [super takePhotoAction:nil]; -} - -- (void)updateHints { - self.flashModeLabel.text = DDDeviceFlashModeHintText(self.captureDevice.flashMode); - self.torchModeLabel.text = DDDeviceTorchModeHintText(self.captureDevice.torchMode); -} - -#pragma mark - DDStillImageViewControllerDelegate - -- (void)stillImageViewController:(DDStillImageViewController *)controller didFailWithError:(NSError *)error { - NSLog(@"Failed to take a photo with error: %@", error.localizedDescription); +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + if ([segue.identifier isEqualToString:@"showDDScannerCameraViewController"]) { + DDScannerCameraViewController *viewController = [segue destinationViewController]; + viewController.scannerDelegate = self; + } } -- (void)stillImageViewController:(DDStillImageViewController *)controller didTakePhoto:(UIImage *)photo { - self.imageView.image = photo; +- (void)scannerCameraViewController:(DDScannerCameraViewController *)controller didScanMachineReadableCode:(NSString * _Nullable)code { + UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"Scan Result" message:code preferredStyle:UIAlertControllerStyleAlert]; + UIAlertAction* okButton = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:nil]; + [alert addAction:okButton]; + [self presentViewController:alert animated:YES completion:nil]; } @end diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index ee2d3fd..3d32776 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -16,6 +16,8 @@ 073A9660A1A127B92D5E6FF2DF621275 /* OCMLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = D9AC401B51C29F4DF6C8B124C8338D1C /* OCMLocation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 07DDE5733255A1D75CB92E2AF73B51B3 /* OCMExceptionReturnValueProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 70063C02AFD65F93A65F15B93E734FE5 /* OCMExceptionReturnValueProvider.h */; settings = {ATTRIBUTES = (Project, ); }; }; 0E6C4F0AA7B846DD75246693901C938D /* OCMObserverRecorder.m in Sources */ = {isa = PBXBuildFile; fileRef = 970EDBB999D51175C9DBE916CD9DBBC4 /* OCMObserverRecorder.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 10EE54752463E39D00FD86DF /* DDScannerViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 10EE54732463E39D00FD86DF /* DDScannerViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 10EE54762463E39D00FD86DF /* DDScannerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 10EE54742463E39D00FD86DF /* DDScannerViewController.m */; }; 14ECEBC338600515A76F40E12C9B82E9 /* AVCaptureDevice+DDCaptureDeviceModesSwitch.h in Headers */ = {isa = PBXBuildFile; fileRef = 42AC94E275E74A61452A339083905430 /* AVCaptureDevice+DDCaptureDeviceModesSwitch.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15E05D1398E023D3D15F30CBA19DF58B /* OCMInvocationMatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = D30AF1F899FD60591E89712D3E3FAD34 /* OCMInvocationMatcher.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 17D66FFBBBADF6B03CF95D1E1B70DC54 /* OCMBoxedReturnValueProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 857F8021D52BB3BF529AFECD3DA2D7F1 /* OCMBoxedReturnValueProvider.h */; settings = {ATTRIBUTES = (Project, ); }; }; @@ -132,6 +134,8 @@ 09BCCA72FED51A01414395CD6EE6B0D4 /* Pods-DDCameraViewController_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-DDCameraViewController_Tests.debug.xcconfig"; sourceTree = ""; }; 0D0DD873228D479C209B4D3844A9FE84 /* OCClassMockObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OCClassMockObject.m; path = Source/OCMock/OCClassMockObject.m; sourceTree = ""; }; 0E3913A0EE93B47F99253EF2F76702BB /* Pods-DDCameraViewController_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-DDCameraViewController_Tests.release.xcconfig"; sourceTree = ""; }; + 10EE54732463E39D00FD86DF /* DDScannerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DDScannerViewController.h; path = DDCameraViewController/Classes/DDScannerViewController.h; sourceTree = ""; }; + 10EE54742463E39D00FD86DF /* DDScannerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DDScannerViewController.m; path = DDCameraViewController/Classes/DDScannerViewController.m; sourceTree = ""; }; 189E844DF5F02337A748A42FA45BE56C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 1961671E2800A5C38CC04D0BE8553B9B /* NSNotificationCenter+OCMAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSNotificationCenter+OCMAdditions.h"; path = "Source/OCMock/NSNotificationCenter+OCMAdditions.h"; sourceTree = ""; }; 1AC588DEF82617F2AAAB67FC05AAEF37 /* Pods-DDCameraViewController_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-DDCameraViewController_Example.release.xcconfig"; sourceTree = ""; }; @@ -480,10 +484,10 @@ 3C192142E8086E0041DEE9AB4062B47E /* DDCameraViewController+DDCaptureStillImageOutput.h */, 5ACCDC068A59D82BAE7089A84008DDDE /* DDCameraViewController+DDCaptureStillImageOutput.m */, 6F3D49933FD39B462CA2C3ADB054CB44 /* DDCameraViewController_Private.h */, + 10EE54732463E39D00FD86DF /* DDScannerViewController.h */, + 10EE54742463E39D00FD86DF /* DDScannerViewController.m */, 704D6A6FDCBC6FC6A58D48DF6D00A43A /* DDStillImageViewController.h */, FDE09A1CA7841D885426FD79C3118AA9 /* DDStillImageViewController.m */, - FC36DF0F9AC0619419A467E32FEBCD6B /* DDCameraView */, - BB8B0E8F9A2AD0B65F4838CA97FAD320 /* DDCameraViewController */, 8443A3FE3801EE5A2C357BDA7D4AA046 /* Pod */, 1E401D16FA5B32611993A1A6E9CA4B59 /* Support Files */, ); @@ -491,13 +495,6 @@ path = ../..; sourceTree = ""; }; - BB8B0E8F9A2AD0B65F4838CA97FAD320 /* DDCameraViewController */ = { - isa = PBXGroup; - children = ( - ); - name = DDCameraViewController; - sourceTree = ""; - }; CA68BA8487AF892AF43F9C1E6D456346 /* Development Pods */ = { isa = PBXGroup; children = ( @@ -532,13 +529,6 @@ name = Pods; sourceTree = ""; }; - FC36DF0F9AC0619419A467E32FEBCD6B /* DDCameraView */ = { - isa = PBXGroup; - children = ( - ); - name = DDCameraView; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -554,6 +544,7 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 10EE54752463E39D00FD86DF /* DDScannerViewController.h in Headers */, 14ECEBC338600515A76F40E12C9B82E9 /* AVCaptureDevice+DDCaptureDeviceModesSwitch.h in Headers */, 6BDA1EB2489555F578B98CB24E9BC0B9 /* AVCaptureDevice+DDCaptureDevicePosition.h in Headers */, 92378DEBFFC9981F081AD31FB5DD1D7B /* DDCameraView.h in Headers */, @@ -702,6 +693,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, ); mainGroup = 7DB346D0F39D3F0E887471402A8071AB; @@ -778,6 +770,7 @@ buildActionMask = 2147483647; files = ( 299D80B739ACBBEC1A0C36FCB277EE3E /* AVCaptureDevice+DDCaptureDeviceModesSwitch.m in Sources */, + 10EE54762463E39D00FD86DF /* DDScannerViewController.m in Sources */, 44E48B8FF213A1F7007D23D0BBA52B0B /* AVCaptureDevice+DDCaptureDevicePosition.m in Sources */, 3675233D1ACD4B72363E75C0FBDD7256 /* DDCameraView.m in Sources */, 275BE603C232BFA4E00E2E1081797451 /* DDCameraViewController+DDCaptureDeviceInputSwitch.m in Sources */, diff --git a/Example/Pods/Target Support Files/DDCameraViewController/DDCameraViewController-umbrella.h b/Example/Pods/Target Support Files/DDCameraViewController/DDCameraViewController-umbrella.h index b0dcedf..74bad27 100644 --- a/Example/Pods/Target Support Files/DDCameraViewController/DDCameraViewController-umbrella.h +++ b/Example/Pods/Target Support Files/DDCameraViewController/DDCameraViewController-umbrella.h @@ -17,8 +17,7 @@ #import "DDCameraViewController+DDCaptureStillImageOutput.h" #import "DDCameraViewController.h" #import "DDStillImageViewController.h" -#import "DDCameraView.h" -#import "DDCameraViewController.h" +#import "DDScannerViewController.h" FOUNDATION_EXPORT double DDCameraViewControllerVersionNumber; FOUNDATION_EXPORT const unsigned char DDCameraViewControllerVersionString[];