// // ScannerViewController.swift // Runner // // Created by Ivan Murashov on 13/07/2017. // Copyright © 2017 The Chromium Authors. All rights reserved. // import UIKit import Flutter extension ZBarSymbolSet: Sequence { //public typealias Element = ZBarSymbol //public typealias Iterator = NSFastEnumerationIterator public func makeIterator() -> NSFastEnumerationIterator { return NSFastEnumerationIterator(self) } } @objc class ScannerViewController: UIViewController, ZBarReaderDelegate, UITextFieldDelegate { enum ButtonState { case card case phone var icon: UIImage { switch self { case .card: return UIImage(named: "card")! case .phone: return UIImage(named: "phone")! } } var inputText: String { switch self { case .card: return "Enter the barcode manualy" case .phone: return "Enter the phone manualy" } } var errorText: String { switch self { case .card: return "User with card number %@ not found" case .phone: return "User with phone number %@ not found" } } var searchType: String { switch self { case .card: return "card" case .phone: return "phone" } } } var buttonState: ButtonState = .card var platformChannel: FlutterMethodChannel? let readerViewController = ZBarReaderViewController() //Вьюшка для верхнего меню let topView = UIView() //Окно ввода кода let textField = UITextField() //Кнопка настроек var settingButton: UIButton! override func viewDidLoad() { super.viewDidLoad() readerViewController.readerDelegate = self readerViewController.readerView.zoom = 1.0 readerViewController.showsZBarControls = false settingButton = UIButton(type: .system) settingButton.addTarget(self, action: #selector(ScannerViewController.buttonTouch), for: .touchUpInside) self.addChildViewController(readerViewController) self.view.addSubview(readerViewController.view) readerViewController.didMove(toParentViewController: self) readerViewController.view.addSubview(topView) topView.addSubview(textField) topView.addSubview(settingButton) textField.delegate = self //textField.keyboardType = .numberPad //Looks for single or multiple taps. let tap = UITapGestureRecognizer(target: self, action: #selector(ScannerViewController.hideKeyboard)) readerViewController.view.addGestureRecognizer(tap) settingButton.setImage(self.buttonState.icon, for: .normal) textField.placeholder = self.buttonState.inputText } func hideKeyboard() { view.endEditing(false) } func buttonTouch(){ switch self.buttonState { case .card: self.buttonState = .phone case .phone: self.buttonState = .card } settingButton.setImage(self.buttonState.icon, for: .normal) textField.placeholder = self.buttonState.inputText } func textFieldShouldReturn(_ textField: UITextField) -> Bool { sendResult(textField.text!) return true } func sendResult(_ str: String) { platformChannel?.invokeMethod("findUser", arguments: [str, buttonState.searchType], result: { (result: Any?) in if result is FlutterError { self.showErrorAlert(str) } else { self.dismiss(animated: true) { self.platformChannel?.invokeMethod("purchase", arguments: [result, str]) } } print("result: \(result.debugDescription )") }) } func showErrorAlert(_ str: String) { let alertController = UIAlertController( title: "Error", message: String(format: buttonState.errorText, str), preferredStyle: UIAlertControllerStyle.alert ) alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.default,handler: nil)) // if let appDelegate = UIApplication.shared.delegate as? FlutterAppDelegate { // appDelegate.window.rootViewController?.present(alertController, animated: true, completion: nil) // } self.present(alertController, animated: true, completion: nil) } override func viewWillAppear(_ animated: Bool) { topView.backgroundColor = UIColor.white textField.borderStyle = .roundedRect super.viewWillAppear(animated) } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) } override func viewWillLayoutSubviews() { readerViewController.view.frame = view.bounds topView.frame = CGRect(x: 0, y: 0, width: readerViewController.view.frame.size.width, height: 40) textField.frame = CGRect(x: settingButton.frame.maxX + 8 + 20 + 5, y: 5, width: readerViewController.view.frame.size.width - 50, height: 30) settingButton.frame = CGRect(x: 8, y: 10, width: 20, height: 20) } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { guard let symbols = info[ZBarReaderControllerResults] as? ZBarSymbolSet else { return } for symbol in symbols { if let symbol = symbol as? ZBarSymbol, let data = symbol.data { sendResult(data) } } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }