Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Corner hugging #64

Merged
merged 3 commits into from
Aug 15, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 16 additions & 15 deletions CardScan/Assets/CardScan.storyboard
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JZr-lh-2mZ" customClass="PreviewView" customModule="CardScan" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="aju-0L-PxB">
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="aju-0L-PxB" customClass="BlurView" customModule="CardScan" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<color key="backgroundColor" red="0.18431372549019609" green="0.20784313725490194" blue="0.25882352941176467" alpha="0.70205479452054798" colorSpace="custom" customColorSpace="calibratedRGB"/>
</view>
Expand Down Expand Up @@ -137,15 +137,6 @@
<constraint firstItem="FbV-Jw-mRi" firstAttribute="top" secondItem="NRD-Sd-k9r" secondAttribute="top" id="yx5-KZ-MVe"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2Xu-ZF-zZr">
<rect key="frame" x="16" y="225.5" width="343" height="216"/>
<constraints>
<constraint firstAttribute="width" secondItem="2Xu-ZF-zZr" secondAttribute="height" multiplier="359:226" id="dV2-Th-3ei"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.18039215689999999" green="0.81568627449999997" blue="0.37647058820000001" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="KJ3-a3-k94" customClass="CornerView" customModule="CardScan" customModuleProvider="target">
<rect key="frame" x="11" y="220.5" width="353" height="226"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
Expand All @@ -162,6 +153,16 @@
<userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
</userDefinedRuntimeAttributes>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2Xu-ZF-zZr">
<rect key="frame" x="16" y="225.5" width="343" height="216"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="width" secondItem="2Xu-ZF-zZr" secondAttribute="height" multiplier="359:226" id="dV2-Th-3ei"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.18039215689999999" green="0.81568627449999997" blue="0.37647058820000001" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="cAV-bO-0Cf">
<rect key="frame" x="8" y="36" width="32" height="32"/>
<constraints>
Expand All @@ -186,22 +187,22 @@
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="2Xu-ZF-zZr" firstAttribute="centerY" secondItem="KJ3-a3-k94" secondAttribute="centerY" id="6bT-aK-zwi"/>
<constraint firstItem="2Xu-ZF-zZr" firstAttribute="centerY" secondItem="dia-FZ-zQY" secondAttribute="centerY" id="9tw-xc-5pe"/>
<constraint firstItem="cAV-bO-0Cf" firstAttribute="top" secondItem="JcX-sc-atK" secondAttribute="top" constant="16" id="Cjz-Yq-gTl"/>
<constraint firstAttribute="bottom" secondItem="JZr-lh-2mZ" secondAttribute="bottom" id="Cly-Ge-Pnk"/>
<constraint firstItem="KJ3-a3-k94" firstAttribute="leading" secondItem="JcX-sc-atK" secondAttribute="leading" constant="11" id="Dnp-K4-oKx"/>
<constraint firstItem="2Xu-ZF-zZr" firstAttribute="centerX" secondItem="dia-FZ-zQY" secondAttribute="centerX" id="GIu-68-Eod"/>
<constraint firstItem="JZr-lh-2mZ" firstAttribute="trailing" secondItem="JcX-sc-atK" secondAttribute="trailing" id="H8H-SY-ZVr"/>
<constraint firstAttribute="trailing" secondItem="2Xu-ZF-zZr" secondAttribute="trailing" constant="16" id="MMw-8z-ePv"/>
<constraint firstItem="JcX-sc-atK" firstAttribute="trailing" secondItem="KJ3-a3-k94" secondAttribute="trailing" constant="11" id="Nn1-04-ziU"/>
<constraint firstItem="2Xu-ZF-zZr" firstAttribute="leading" secondItem="JcX-sc-atK" secondAttribute="leading" constant="16" id="OTn-gs-xZV"/>
<constraint firstItem="2Xu-ZF-zZr" firstAttribute="centerX" secondItem="KJ3-a3-k94" secondAttribute="centerX" id="Ocl-n4-adh"/>
<constraint firstItem="cAV-bO-0Cf" firstAttribute="leading" secondItem="JcX-sc-atK" secondAttribute="leading" constant="8" id="Phv-cQ-Tcx"/>
<constraint firstAttribute="trailing" secondItem="KJ3-a3-k94" secondAttribute="trailing" constant="11" id="crA-tj-ugH"/>
<constraint firstItem="KJ3-a3-k94" firstAttribute="centerX" secondItem="2Xu-ZF-zZr" secondAttribute="centerX" id="jnv-8C-RkS"/>
<constraint firstItem="KJ3-a3-k94" firstAttribute="leading" secondItem="JcX-sc-atK" secondAttribute="leading" constant="11" id="eKv-If-wZv"/>
<constraint firstItem="JZr-lh-2mZ" firstAttribute="leading" secondItem="JcX-sc-atK" secondAttribute="leading" id="nSQ-BB-hSb"/>
<constraint firstItem="aTS-Jy-HLZ" firstAttribute="centerY" secondItem="cAV-bO-0Cf" secondAttribute="centerY" id="oR8-l5-AvK"/>
<constraint firstItem="JZr-lh-2mZ" firstAttribute="top" secondItem="dia-FZ-zQY" secondAttribute="top" id="ov6-QA-4UQ"/>
<constraint firstItem="aTS-Jy-HLZ" firstAttribute="leading" secondItem="cAV-bO-0Cf" secondAttribute="trailing" constant="-11" id="vaf-qc-blT"/>
<constraint firstItem="KJ3-a3-k94" firstAttribute="centerY" secondItem="2Xu-ZF-zZr" secondAttribute="centerY" id="yr7-v6-vnf"/>
</constraints>
<viewLayoutGuide key="safeArea" id="JcX-sc-atK"/>
</view>
Expand All @@ -210,7 +211,7 @@
<outlet property="backButtonImageButton" destination="cAV-bO-0Cf" id="5jh-fo-Z7b"/>
<outlet property="backButtonImageToTextConstraint" destination="vaf-qc-blT" id="5Bl-x6-vIr"/>
<outlet property="backButtonWidthConstraint" destination="EaN-bi-nZq" id="3GV-jN-upY"/>
<outlet property="blurView" destination="aju-0L-PxB" id="O2s-Pr-FEO"/>
<outlet property="blurView" destination="aju-0L-PxB" id="Lo0-KK-LRH"/>
<outlet property="cardNumberLabel" destination="mhR-St-yeE" id="Zwu-8I-mT9"/>
<outlet property="cornerView" destination="KJ3-a3-k94" id="omZ-WY-02b"/>
<outlet property="debugImageView" destination="FbV-Jw-mRi" id="Hhh-cL-znj"/>
Expand Down
37 changes: 37 additions & 0 deletions CardScan/Classes/BlurView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
//
// BlurView.swift
// CardScan
//
// Created by Jaime Park on 8/15/19.
//

import UIKit

public class BlurView: UIView {
public required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}

public override init(frame: CGRect) {
super.init(frame: frame)
}

public func maskToRoi(roi: UIView) {
let maskLayer = CAShapeLayer()
let path = CGMutablePath()
let roiCornerRadius = roi.layer.cornerRadius
let roiFrame = roi.layer.frame
let roundedRectpath = UIBezierPath.init(roundedRect: roiFrame, cornerRadius: roiCornerRadius).cgPath

path.addRect(self.layer.bounds)
path.addPath(roundedRectpath)
maskLayer.path = path
#if swift(>=4.2)
maskLayer.fillRule = .evenOdd
#else
maskLayer.fillRule = kCAFillRuleEvenOdd
#endif
self.layer.mask = maskLayer
}

}
8 changes: 8 additions & 0 deletions CardScan/Classes/CornerView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@ public class CornerView: UIView {
super.init(frame: frame)
}

public func setFrameSize(roi: UIView) {
let borderWidth = self.layer.borderWidth
let width = roi.layer.bounds.width + 2*borderWidth
let height = roi.layer.bounds.height + 2*borderWidth
let cornerViewBoundRect = CGRect(x: self.layer.bounds.origin.x, y: self.layer.bounds.origin.y, width: width, height: height)
self.layer.bounds = cornerViewBoundRect
}

public func drawCorners(){
let maskShapeLayer = CAShapeLayer()
let maskPath = CGMutablePath()
Expand Down
66 changes: 22 additions & 44 deletions CardScan/Classes/ScanBaseViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ import Vision
private weak var debugImageView: UIImageView?
private weak var previewView: PreviewView?
private weak var regionOfInterestLabel: UILabel?
private weak var blurView: UIView?
private weak var blurView: BlurView?
private weak var cornerView: CornerView?
private var regionOfInterestLabelFrame: CGRect?

var videoFeed = VideoFeed()
Expand Down Expand Up @@ -129,42 +130,18 @@ import Vision
// fire and forget
Api.scanStats(scanStats: self.ocr.scanStats, completion: {_, _ in })
}

func maskPreviewView(viewToMask: UIView, maskRect: CGRect) {
let maskLayer = CAShapeLayer()
let path = CGMutablePath()
let roundedRectpath = UIBezierPath.init(roundedRect: maskRect, cornerRadius: regionCornerRadius).cgPath
path.addRect(viewToMask.bounds)
path.addPath(roundedRectpath)
maskLayer.path = path
#if swift(>=4.2)
maskLayer.fillRule = .evenOdd
#else
maskLayer.fillRule = kCAFillRuleEvenOdd
#endif
viewToMask.layer.mask = maskLayer

func setupMask() {
guard let roi = self.regionOfInterestLabel else { return }
guard let blurView = self.blurView else { return }
blurView.maskToRoi(roi: roi)
}

func setupMask() {
// store .frame to avoid accessing UI APIs in the machineLearningQueue
guard let roiFrame = self.regionOfInterestLabel?.frame else {
print("could not get frame")
return
}

self.regionOfInterestLabelFrame = roiFrame

guard let frame = self.regionOfInterestLabelFrame else {
print("no ROI frame found")
return
}

guard let blurView = self.blurView else {
print("no blur view")
return
}

self.maskPreviewView(viewToMask: blurView, maskRect: frame)
public func setUpCorners() {
guard let roi = self.regionOfInterestLabel else { return }
guard let corners = self.cornerView else { return }
corners.setFrameSize(roi: roi)
corners.drawCorners()
}

// you must call setupOnViewDidLoad before calling this function and you have to call
Expand All @@ -173,12 +150,13 @@ import Vision
self.videoFeed.requestCameraAccess()
}

public func setupOnViewDidLoad(regionOfInterestLabel: UILabel, blurView: UIView, previewView: PreviewView, debugImageView: UIImageView?) {
public func setupOnViewDidLoad(regionOfInterestLabel: UILabel, blurView: BlurView, previewView: PreviewView, cornerView: CornerView, debugImageView: UIImageView?) {

self.regionOfInterestLabel = regionOfInterestLabel
self.blurView = blurView
self.previewView = previewView
self.debugImageView = debugImageView
self.cornerView = cornerView

setNeedsStatusBarAppearanceUpdate()
regionOfInterestLabel.layer.masksToBounds = true
Expand Down Expand Up @@ -214,7 +192,6 @@ import Vision

override open func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)

self.ocr.numbers.removeAll()
self.ocr.expiries.removeAll()
self.ocr.firstResult = nil
Expand All @@ -224,17 +201,18 @@ import Vision
self.navigationController?.setNavigationBarHidden(true, animated: animated)
}

// Views are lazily loaded (View Management in doc) : https://developer.apple.com/documentation/uikit/uiviewcontroller
// Once added to the app view's hierarchy, can you fetch view data https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiOSAppsSwift/WorkWithViewControllers.html
open override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(true)
override open func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
guard let roiFrame = self.regionOfInterestLabel?.frame else { return }
// store .frame to avoid accessing UI APIs in the machineLearningQueue
self.regionOfInterestLabelFrame = roiFrame
self.setUpCorners()
self.setupMask()
}

override open func viewWillDisappear(_ animated: Bool) {
self.videoFeed.willDisappear()

super.viewWillDisappear(animated)
self.videoFeed.willDisappear()

if !self.isNavigationBarHidden {
self.navigationController?.setNavigationBarHidden(false, animated: animated)
Expand Down
5 changes: 2 additions & 3 deletions CardScan/Classes/ScanViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ import UIKit

@IBOutlet weak var expiryLabel: UILabel!
@IBOutlet weak var cardNumberLabel: UILabel!
@IBOutlet weak var blurView: UIView!
@IBOutlet weak var blurView: BlurView!

@IBOutlet weak var scanCardLabel: UILabel!
@IBOutlet weak var positionCardLabel: UILabel!
Expand Down Expand Up @@ -208,7 +208,7 @@ import UIKit
}

let debugImageView = self.showDebugImageView ? self.debugImageView : nil
self.setupOnViewDidLoad(regionOfInterestLabel: self.regionOfInterestLabel, blurView: self.blurView, previewView: self.previewView, debugImageView: debugImageView)
self.setupOnViewDidLoad(regionOfInterestLabel: self.regionOfInterestLabel, blurView: self.blurView, previewView: self.previewView, cornerView: self.cornerView, debugImageView: debugImageView)
self.startCameraPreview()
}

Expand All @@ -219,7 +219,6 @@ import UIKit

public override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.cornerView.drawCorners()
}

override public func showCardNumber(_ number: String, expiry: String?) {
Expand Down
Loading