Просмотр исходного кода

Added scanArea for iOS.

flutter-beta
Julian Steenbakker 5 лет назад
Родитель
Сommit
7d12605a7b
4 измененных файлов: 47 добавлений и 23 удалений
  1. +7
    -9
      example/ios/Runner.xcodeproj/project.pbxproj
  2. +13
    -3
      example/lib/main.dart
  3. +15
    -3
      ios/Classes/QRView.swift
  4. +12
    -8
      lib/src/qr_code_scanner.dart

+ 7
- 9
example/ios/Runner.xcodeproj/project.pbxproj Просмотреть файл

@@ -168,7 +168,7 @@
TargetAttributes = { TargetAttributes = {
97C146ED1CF9000F007C117D = { 97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1; CreatedOnToolsVersion = 7.3.1;
DevelopmentTeam = 5LSCTACHT8;
DevelopmentTeam = RCH2VG82SH;
LastSwiftMigration = 1020; LastSwiftMigration = 1020;
ProvisioningStyle = Automatic; ProvisioningStyle = Automatic;
}; };
@@ -250,13 +250,11 @@
); );
inputPaths = ( inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
"${PODS_ROOT}/../Flutter/Flutter.framework",
"${BUILT_PRODUCTS_DIR}/MTBBarcodeScanner/MTBBarcodeScanner.framework", "${BUILT_PRODUCTS_DIR}/MTBBarcodeScanner/MTBBarcodeScanner.framework",
"${BUILT_PRODUCTS_DIR}/qr_code_scanner/qr_code_scanner.framework", "${BUILT_PRODUCTS_DIR}/qr_code_scanner/qr_code_scanner.framework",
); );
name = "[CP] Embed Pods Frameworks"; name = "[CP] Embed Pods Frameworks";
outputPaths = ( outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MTBBarcodeScanner.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MTBBarcodeScanner.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/qr_code_scanner.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/qr_code_scanner.framework",
); );
@@ -372,7 +370,7 @@
CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 5LSCTACHT8;
DEVELOPMENT_TEAM = RCH2VG82SH;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
@@ -384,7 +382,7 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
PRODUCT_BUNDLE_IDENTIFIER = dev.steenbakker.capture;
PRODUCT_BUNDLE_IDENTIFIER = dev.steenbakker.camera;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 4.0; SWIFT_VERSION = 4.0;
@@ -510,7 +508,7 @@
CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 5LSCTACHT8;
DEVELOPMENT_TEAM = RCH2VG82SH;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
@@ -522,7 +520,7 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
PRODUCT_BUNDLE_IDENTIFIER = dev.steenbakker.capture;
PRODUCT_BUNDLE_IDENTIFIER = dev.steenbakker.camera;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -541,7 +539,7 @@
CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 5LSCTACHT8;
DEVELOPMENT_TEAM = RCH2VG82SH;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
@@ -553,7 +551,7 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
PRODUCT_BUNDLE_IDENTIFIER = dev.steenbakker.capture;
PRODUCT_BUNDLE_IDENTIFIER = dev.steenbakker.camera;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";


+ 13
- 3
example/lib/main.dart Просмотреть файл

@@ -1,3 +1,5 @@
import 'dart:io';

import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:qr_code_scanner/qr_code_scanner.dart'; import 'package:qr_code_scanner/qr_code_scanner.dart';
@@ -25,10 +27,16 @@ class _QRViewExampleState extends State<QRViewExample> {
QRViewController controller; QRViewController controller;
final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');


// In order to get hot reload to work we need to pause the camera if the platform
// is android, or resume the camera if the platform is iOS.
@override @override
void reassemble() { void reassemble() {
super.reassemble(); super.reassemble();
controller.pauseCamera();
if (Platform.isAndroid) {
controller.pauseCamera();
} else if (Platform.isIOS) {
controller.resumeCamera();
}
} }


@override @override
@@ -139,11 +147,13 @@ class _QRViewExampleState extends State<QRViewExample> {
} }


Widget _buildQrView(BuildContext context) { Widget _buildQrView(BuildContext context) {
// For this example we check how width or tall the device is and change the scanArea and overlay accordingly.
double scanArea = (MediaQuery.of(context).size.width < 500 || MediaQuery.of(context).size.height < 400) ? 150 : 300;
// To ensure the Scanner view is properly sizes after rotation // To ensure the Scanner view is properly sizes after rotation
// we need to listen for Flutter SizeChanged notification and update controller // we need to listen for Flutter SizeChanged notification and update controller
return NotificationListener<SizeChangedLayoutNotification>( return NotificationListener<SizeChangedLayoutNotification>(
onNotification: (notification) { onNotification: (notification) {
Future.microtask(() => controller?.updateDimensions(qrKey));
Future.microtask(() => controller?.updateDimensions(qrKey, scanArea: scanArea));
return false; return false;
}, },
child: SizeChangedLayoutNotifier( child: SizeChangedLayoutNotifier(
@@ -156,7 +166,7 @@ class _QRViewExampleState extends State<QRViewExample> {
borderRadius: 10, borderRadius: 10,
borderLength: 30, borderLength: 30,
borderWidth: 10, borderWidth: 10,
cutOutSize: 300,
cutOutSize: scanArea,
), ),
))); )));
} }


+ 15
- 3
ios/Classes/QRView.swift Просмотреть файл

@@ -13,15 +13,18 @@ public class QRView:NSObject,FlutterPlatformView {
var scanner: MTBBarcodeScanner? var scanner: MTBBarcodeScanner?
var registrar: FlutterPluginRegistrar var registrar: FlutterPluginRegistrar
var channel: FlutterMethodChannel var channel: FlutterMethodChannel
var frame: CGRect
public init(withFrame frame: CGRect, withRegistrar registrar: FlutterPluginRegistrar, withId id: Int64){ public init(withFrame frame: CGRect, withRegistrar registrar: FlutterPluginRegistrar, withId id: Int64){
self.registrar = registrar self.registrar = registrar
self.frame = frame
previewView = UIView(frame: frame) previewView = UIView(frame: frame)
channel = FlutterMethodChannel(name: "net.touchcapture.qr.flutterqr/qrview_\(id)", binaryMessenger: registrar.messenger()) channel = FlutterMethodChannel(name: "net.touchcapture.qr.flutterqr/qrview_\(id)", binaryMessenger: registrar.messenger())
} }
func isCameraAvailable(success: Bool) -> Void { func isCameraAvailable(success: Bool) -> Void {
if success { if success {
do { do {
try scanner?.startScanning(resultBlock: { [weak self] codes in try scanner?.startScanning(resultBlock: { [weak self] codes in
if let codes = codes { if let codes = codes {
@@ -74,7 +77,7 @@ public class QRView:NSObject,FlutterPlatformView {
switch(call.method){ switch(call.method){
case "setDimensions": case "setDimensions":
let arguments = call.arguments as! Dictionary<String, Double> let arguments = call.arguments as! Dictionary<String, Double>
self?.setDimensions(width: arguments["width"] ?? 0,height: arguments["height"] ?? 0)
self?.setDimensions(width: arguments["width"] ?? 0, height: arguments["height"] ?? 0, scanArea: arguments["scanArea"] ?? 0)
case "flipCamera": case "flipCamera":
self?.flipCamera() self?.flipCamera()
case "toggleFlash": case "toggleFlash":
@@ -91,15 +94,24 @@ public class QRView:NSObject,FlutterPlatformView {
return previewView return previewView
} }
func setDimensions(width: Double, height: Double) -> Void {
func setDimensions(width: Double, height: Double, scanArea: Double) -> Void {
previewView.frame = CGRect(x: 0, y: 0, width: width, height: height) previewView.frame = CGRect(x: 0, y: 0, width: width, height: height)

let midX = self.view().bounds.midX
let midY = self.view().bounds.midY
if let sc: MTBBarcodeScanner = scanner { if let sc: MTBBarcodeScanner = scanner {
if let previewLayer = sc.previewLayer { if let previewLayer = sc.previewLayer {
previewLayer.frame = previewView.bounds; previewLayer.frame = previewView.bounds;
} }
} else { } else {
scanner = MTBBarcodeScanner(previewView: previewView) scanner = MTBBarcodeScanner(previewView: previewView)
if (scanArea != 0) {
scanner?.didStartScanningBlock = {
self.scanner?.scanRect = CGRect(x: Double(midX) - (scanArea / 2), y: Double(midY) - (scanArea / 2), width: scanArea, height: scanArea)
}
}


MTBBarcodeScanner.requestCameraPermission(success: isCameraAvailable) MTBBarcodeScanner.requestCameraPermission(success: isCameraAvailable)
} }
} }


+ 12
- 8
lib/src/qr_code_scanner.dart Просмотреть файл

@@ -3,6 +3,7 @@ import 'dart:async';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:qr_code_scanner/qr_code_scanner.dart';


typedef QRViewCreatedCallback = void Function(QRViewController); typedef QRViewCreatedCallback = void Function(QRViewController);


@@ -110,7 +111,7 @@ class _QRViewState extends State<QRView> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Stack( return Stack(
children: [ children: [
_getPlatformQrView(),
_getPlatformQrView(widget.key),
if (widget.overlay != null) if (widget.overlay != null)
Container( Container(
padding: widget.overlayMargin, padding: widget.overlayMargin,
@@ -124,7 +125,7 @@ class _QRViewState extends State<QRView> {
); );
} }


Widget _getPlatformQrView() {
Widget _getPlatformQrView(GlobalKey key) {
Widget _platformQrView; Widget _platformQrView;
switch (defaultTargetPlatform) { switch (defaultTargetPlatform) {
case TargetPlatform.android: case TargetPlatform.android:
@@ -137,7 +138,7 @@ class _QRViewState extends State<QRView> {
_platformQrView = UiKitView( _platformQrView = UiKitView(
viewType: 'net.touchcapture.qr.flutterqr/qrview', viewType: 'net.touchcapture.qr.flutterqr/qrview',
onPlatformViewCreated: _onPlatformViewCreated, onPlatformViewCreated: _onPlatformViewCreated,
creationParams: _CreationParams.fromWidget(0, 0).toMap(),
creationParams: _CreationParams.fromWidget(MediaQuery.of(context).size.width, 400).toMap(),
creationParamsCodec: StandardMessageCodec(), creationParamsCodec: StandardMessageCodec(),
); );
break; break;
@@ -152,7 +153,8 @@ class _QRViewState extends State<QRView> {
if (widget.onQRViewCreated == null) { if (widget.onQRViewCreated == null) {
return; return;
} }
widget.onQRViewCreated(QRViewController._(id, widget.key));

widget.onQRViewCreated(QRViewController._(id, widget.key, (widget.overlay as QrScannerOverlayShape).cutOutSize));
} }
} }


@@ -178,9 +180,9 @@ class _CreationParams {
} }


class QRViewController { class QRViewController {
QRViewController._(int id, GlobalKey qrKey)
QRViewController._(int id, GlobalKey qrKey, double scanArea)
: _channel = MethodChannel('net.touchcapture.qr.flutterqr/qrview_$id') { : _channel = MethodChannel('net.touchcapture.qr.flutterqr/qrview_$id') {
updateDimensions(qrKey);
updateDimensions(qrKey, scanArea: scanArea);
_channel.setMethodCallHandler( _channel.setMethodCallHandler(
(call) async { (call) async {
switch (call.method) { switch (call.method) {
@@ -231,11 +233,13 @@ class QRViewController {
_scanUpdateController.close(); _scanUpdateController.close();
} }


void updateDimensions(GlobalKey key) {
void updateDimensions(GlobalKey key, {double scanArea}) {
if (defaultTargetPlatform == TargetPlatform.iOS) { if (defaultTargetPlatform == TargetPlatform.iOS) {
final RenderBox renderBox = key.currentContext.findRenderObject(); final RenderBox renderBox = key.currentContext.findRenderObject();
_channel.invokeMethod('setDimensions', _channel.invokeMethod('setDimensions',
{'width': renderBox.size.width, 'height': renderBox.size.height});
{'width': renderBox.size.width,
'height': renderBox.size.height,
'scanArea': scanArea?? 0});
} }
} }
} }

Загрузка…
Отмена
Сохранить