Files
checker/ios/Runner/ScannerViewController.swift
2018-01-24 13:48:46 +07:00

251 lines
7.5 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//
// 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 AppLocale {
case ru
case en
}
enum ButtonState {
case card
case phone
var icon: UIImage {
switch self {
case .card: return UIImage(named: "card")!
case .phone: return UIImage(named: "phone")!
}
}
var searchType: String {
switch self {
case .card: return "card"
case .phone: return "phone"
}
}
}
var appLocale: AppLocale
var buttonState: ButtonState = .card
var platformChannel: FlutterMethodChannel?
let readerViewController = ZBarReaderViewController()
//Вьюшка для верхнего меню
let topView = UIView()
//Окно ввода кода
let textField = UITextField()
//Кнопка настроек
var settingButton: UIButton!
required init?(coder aDecoder: NSCoder) {
self.appLocale = .en
super.init(coder: aDecoder)
}
init(locale: String) {
switch locale {
case "ru": self.appLocale = .ru; break
default: self.appLocale = .en
}
super.init(nibName: nil, bundle: nil)
}
func getCardHint() -> String {
switch self.appLocale {
case .ru: return "Ввести номер карты вручную"
default: return "Enter the barcode manually"
}
}
func getPhoneHint() -> String {
switch self.appLocale {
case .ru: return "Ввести номер телефона вручную"
default: return "Enter the phone manually"
}
}
func getInputHint() -> String {
switch self.buttonState {
case .card: return self.getCardHint()
case .phone: return self.getPhoneHint()
}
}
func getErrorTitle() -> String {
switch self.appLocale {
case .ru: return "Ошибка"
default: return "Error"
}
}
func getCardErrorText() -> String {
switch self.appLocale {
case .ru: return "Пользователь с номером карты %@ не найден"
default: return "User with card number %@ not found"
}
}
func getPhoneErrorText() -> String {
switch self.appLocale {
case .ru: return "Пользователь с номером телефона %@ не найден"
default: return "User with phone number %@ not found"
}
}
func getErrorText() -> String {
switch self.buttonState {
case .card: return self.getCardErrorText()
case .phone: return self.getPhoneErrorText()
}
}
func getDismissText() -> String {
switch self.appLocale {
case .ru: return "Скрыть"
default: return "Dismiss"
}
}
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.getInputHint()
}
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.getInputHint()
}
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: self.getErrorTitle(),
message: String(format: self.getErrorText(), str),
preferredStyle: UIAlertControllerStyle.alert
)
alertController.addAction(UIAlertAction(title: self.getDismissText(), 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()
}
}