diff --git a/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..6b30c74 --- /dev/null +++ b/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,10 @@ + + + + + BuildSystemType + Original + PreviewsEnabled + + + diff --git a/ios/Classes/BarcodeScannerViewController.m b/ios/Classes/BarcodeScannerViewController.m index da44ca0..662c381 100644 --- a/ios/Classes/BarcodeScannerViewController.m +++ b/ios/Classes/BarcodeScannerViewController.m @@ -10,6 +10,35 @@ @implementation BarcodeScannerViewController { } +- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator +{ + CGRect bounds = [UIScreen mainScreen].bounds; + CGRect reversedBounds = CGRectMake(bounds.origin.x, bounds.origin.y, bounds.size.height, bounds.size.width); + self.previewView.bounds = reversedBounds; + self.previewView.frame = reversedBounds; + [self.scanRect stopAnimating]; + [self.scanRect removeFromSuperview]; + [self setupScanRect:reversedBounds]; + [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; +} + +- (void)setupScanRect:(CGRect)bounds { + self.scanRect = [[ScannerOverlay alloc] initWithFrame:bounds]; + self.scanRect.translatesAutoresizingMaskIntoConstraints = NO; + self.scanRect.backgroundColor = UIColor.clearColor; + [self.view addSubview:_scanRect]; + [self.view addConstraints:[NSLayoutConstraint + constraintsWithVisualFormat:@"V:[scanRect]" + options:NSLayoutFormatAlignAllBottom + metrics:nil + views:@{@"scanRect": _scanRect}]]; + [self.view addConstraints:[NSLayoutConstraint + constraintsWithVisualFormat:@"H:[scanRect]" + options:NSLayoutFormatAlignAllBottom + metrics:nil + views:@{@"scanRect": _scanRect}]]; + [_scanRect startAnimating]; +} - (void)viewDidLoad { [super viewDidLoad]; @@ -26,21 +55,7 @@ options:NSLayoutFormatAlignAllBottom metrics:nil views:@{@"previewView": _previewView}]]; - self.scanRect = [[ScannerOverlay alloc] initWithFrame:self.view.bounds]; - self.scanRect.translatesAutoresizingMaskIntoConstraints = NO; - self.scanRect.backgroundColor = UIColor.clearColor; - [self.view addSubview:_scanRect]; - [self.view addConstraints:[NSLayoutConstraint - constraintsWithVisualFormat:@"V:[scanRect]" - options:NSLayoutFormatAlignAllBottom - metrics:nil - views:@{@"scanRect": _scanRect}]]; - [self.view addConstraints:[NSLayoutConstraint - constraintsWithVisualFormat:@"H:[scanRect]" - options:NSLayoutFormatAlignAllBottom - metrics:nil - views:@{@"scanRect": _scanRect}]]; - [_scanRect startAnimating]; + [self setupScanRect:self.view.bounds]; self.scanner = [[MTBBarcodeScanner alloc] initWithPreviewView:_previewView]; self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancel)]; [self updateFlashButton]; diff --git a/ios/Classes/ScannerOverlay.m b/ios/Classes/ScannerOverlay.m index ab4c121..7c415b9 100644 --- a/ios/Classes/ScannerOverlay.m +++ b/ios/Classes/ScannerOverlay.m @@ -83,19 +83,31 @@ } - (CGRect)scanRect { - CGRect rect = self.frame; - CGFloat heightMultiplier = 3.0/4.0; // 4:3 aspect ratio - CGFloat scanRectWidth = rect.size.width * 0.8f; - CGFloat scanRectHeight = scanRectWidth * heightMultiplier; - CGFloat scanRectOriginX = (rect.size.width / 2) - (scanRectWidth / 2); - CGFloat scanRectOriginY = (rect.size.height / 2) - (scanRectHeight / 2); - return CGRectMake(scanRectOriginX, scanRectOriginY, scanRectWidth, scanRectHeight); + CGRect rect = self.frame; + + CGFloat frameWidth = rect.size.width; + CGFloat frameHeight = rect.size.height; + + BOOL isLandscape = frameWidth > frameHeight; + CGFloat widthOnPortrait = isLandscape ? frameHeight : frameWidth; + CGFloat scanRectWidth = widthOnPortrait * 0.8f; + CGFloat aspectRatio = 3.0/4.0; + CGFloat scanRectHeight = scanRectWidth * aspectRatio; + + if(isLandscape) { + CGFloat navbarHeight = 32; + frameHeight += navbarHeight; + } + + CGFloat scanRectOriginX = (frameWidth - scanRectWidth) / 2; + CGFloat scanRectOriginY = (frameHeight - scanRectHeight) / 2; + return CGRectMake(scanRectOriginX, scanRectOriginY, scanRectWidth, scanRectHeight); } - (CGRect)scanLineRect { CGRect scanRect = [self scanRect]; - CGRect rect = self.frame; - return CGRectMake(scanRect.origin.x, rect.size.height / 2, scanRect.size.width, 1); + CGFloat positionY = scanRect.origin.y + (scanRect.size.height / 2); + return CGRectMake(scanRect.origin.x, positionY, scanRect.size.width, 1); } @end