* Add iOS linter & report issues on PR * Fix lint errors --------- Co-authored-by: Seph Soliman <github@seph.dk>
99 lines
2.9 KiB
Swift
99 lines
2.9 KiB
Swift
//
|
|
// ScannerFrame.swift
|
|
// ReactNativeCameraKit
|
|
//
|
|
|
|
import UIKit
|
|
|
|
/*
|
|
* Frame for the barcode scanner
|
|
*/
|
|
class ScannerFrameView: UIView {
|
|
private let laserView = UIView()
|
|
private let frameViews: [UIView] = (0..<8).map { _ in UIView() }
|
|
|
|
// MARK: - Lifecycle
|
|
|
|
init(frameColor: UIColor, laserColor: UIColor) {
|
|
super.init(frame: .zero)
|
|
|
|
laserView.backgroundColor = laserColor
|
|
addSubview(laserView)
|
|
|
|
frameViews.forEach {
|
|
$0.backgroundColor = frameColor
|
|
addSubview($0)
|
|
}
|
|
}
|
|
|
|
@available(*, unavailable)
|
|
required init?(coder aDecoder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
override func draw(_ rect: CGRect) {
|
|
super.draw(rect)
|
|
|
|
frameViews.enumerated().forEach { (index, view) in
|
|
view.frame = sizeForFramePart(at: index)
|
|
}
|
|
|
|
startAnimatingScanner()
|
|
}
|
|
|
|
// MARK: - Public
|
|
|
|
func startAnimatingScanner() {
|
|
if laserView.frame.origin.y != 0 {
|
|
laserView.frame = CGRect(x: 2, y: 2, width: frame.size.width - 4, height: 2)
|
|
}
|
|
|
|
UIView.animate(withDuration: 3, delay: 0, options: [.autoreverse, .repeat], animations: {
|
|
self.laserView.center = CGPoint(x: self.frame.size.width / 2, y: self.frame.size.height - 3)
|
|
})
|
|
}
|
|
|
|
func stopAnimatingScanner() {
|
|
laserView.removeFromSuperview()
|
|
}
|
|
|
|
func update(frameColor: UIColor) {
|
|
frameViews.forEach { $0.backgroundColor = frameColor }
|
|
}
|
|
|
|
func update(laserColor: UIColor) {
|
|
laserView.backgroundColor = laserColor
|
|
}
|
|
|
|
// MARK: - Private
|
|
|
|
private func sizeForFramePart(at index: Int) -> CGRect {
|
|
let cornerHeight: CGFloat = 20.0
|
|
let cornerWidth: CGFloat = 2.0
|
|
|
|
switch index {
|
|
case 0:
|
|
return .init(x: 0, y: 0, width: cornerWidth, height: cornerHeight)
|
|
case 1:
|
|
return .init(x: 0, y: 0, width: cornerHeight, height: cornerWidth)
|
|
case 2:
|
|
return .init(x: bounds.width - cornerHeight, y: 0, width: cornerHeight, height: cornerWidth)
|
|
case 3:
|
|
return .init(x: bounds.width - cornerWidth, y: 0, width: cornerWidth, height: cornerHeight)
|
|
case 4:
|
|
return .init(x: bounds.width - cornerWidth,
|
|
y: bounds.height - cornerHeight,
|
|
width: cornerWidth,
|
|
height: cornerHeight)
|
|
case 5:
|
|
return .init(x: bounds.width - cornerHeight, y: bounds.height - cornerWidth, width: cornerHeight, height: cornerWidth)
|
|
case 6:
|
|
return .init(x: 0, y: bounds.height - cornerWidth, width: cornerHeight, height: cornerWidth)
|
|
case 7:
|
|
return .init(x: 0, y: bounds.height - cornerHeight, width: cornerWidth, height: cornerHeight)
|
|
default:
|
|
fatalError("unknown index")
|
|
}
|
|
}
|
|
}
|