Skip to content

Commit 22c3c3f

Browse files
Merge pull request #14 from regulaforensics/ui-configuration
UI configuration
2 parents 9051bd0 + 5828e96 commit 22c3c3f

16 files changed

Lines changed: 186 additions & 52 deletions

Catalog.xcodeproj/project.pbxproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@
5050
96AA511D2A0109AC00783B08 /* DetectFacesItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96AA511B2A0109AC00783B08 /* DetectFacesItem.swift */; };
5151
96AA511E2A0109AC00783B08 /* ImageQualityItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96AA511C2A0109AC00783B08 /* ImageQualityItem.swift */; };
5252
96AA51202A010A2A00783B08 /* QualityResultsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96AA511F2A010A2A00783B08 /* QualityResultsViewController.swift */; };
53+
9D0660742A3337D9000370EC /* LivenessUIConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D0660732A3337D9000370EC /* LivenessUIConfiguration.swift */; };
54+
9D7EFC862A4D793B0016736B /* FaceCaptureUIConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D7EFC852A4D793B0016736B /* FaceCaptureUIConfiguration.swift */; };
5355
9DC35FC2298174D00043FBB1 /* LivenessSkipOnboardingAndSuccessItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DC35FC1298174D00043FBB1 /* LivenessSkipOnboardingAndSuccessItem.swift */; };
5456
9DE86D922850820400FCC18C /* FaceCaptureHideTorchConfigurationItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DE86D902850820400FCC18C /* FaceCaptureHideTorchConfigurationItem.swift */; };
5557
F1D3B0BD2ECCF5ED96E71FEB /* Pods_Catalog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D1DBE93D03DA4D5B36021E6A /* Pods_Catalog.framework */; };
@@ -128,6 +130,8 @@
128130
96AA511B2A0109AC00783B08 /* DetectFacesItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetectFacesItem.swift; sourceTree = "<group>"; };
129131
96AA511C2A0109AC00783B08 /* ImageQualityItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageQualityItem.swift; sourceTree = "<group>"; };
130132
96AA511F2A010A2A00783B08 /* QualityResultsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QualityResultsViewController.swift; sourceTree = "<group>"; };
133+
9D0660732A3337D9000370EC /* LivenessUIConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LivenessUIConfiguration.swift; sourceTree = "<group>"; };
134+
9D7EFC852A4D793B0016736B /* FaceCaptureUIConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaceCaptureUIConfiguration.swift; sourceTree = "<group>"; };
131135
9DC35FC1298174D00043FBB1 /* LivenessSkipOnboardingAndSuccessItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LivenessSkipOnboardingAndSuccessItem.swift; sourceTree = "<group>"; };
132136
9DE86D902850820400FCC18C /* FaceCaptureHideTorchConfigurationItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FaceCaptureHideTorchConfigurationItem.swift; sourceTree = "<group>"; };
133137
D1DBE93D03DA4D5B36021E6A /* Pods_Catalog.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Catalog.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -269,6 +273,8 @@
269273
86B6D2F62655306500794170 /* ViewCustomization */ = {
270274
isa = PBXGroup;
271275
children = (
276+
9D0660732A3337D9000370EC /* LivenessUIConfiguration.swift */,
277+
9D7EFC852A4D793B0016736B /* FaceCaptureUIConfiguration.swift */,
272278
86B6D2F126552EF800794170 /* LivenessHintViewAppearanceItem.swift */,
273279
86D5E284266116B80076D417 /* LivenessHintPositionItem.swift */,
274280
86D5E288266118400076D417 /* LivenessToolbarAppearanceItem.swift */,
@@ -483,6 +489,8 @@
483489
86B2D27C2655568400D85D45 /* UIView+Layout.swift in Sources */,
484490
86B6D2C12653DA7C00794170 /* RFCCatalogItem.m in Sources */,
485491
86D5E2A7266128160076D417 /* FaceCaptureBackgroundColor.swift in Sources */,
492+
9D0660742A3337D9000370EC /* LivenessUIConfiguration.swift in Sources */,
493+
9D7EFC862A4D793B0016736B /* FaceCaptureUIConfiguration.swift in Sources */,
486494
86B6D2F226552EF800794170 /* LivenessHintViewAppearanceItem.swift in Sources */,
487495
86D5E285266116B80076D417 /* LivenessHintPositionItem.swift in Sources */,
488496
86D5E2A1266123480076D417 /* LivenessLogoItem.swift in Sources */,

Catalog/Core/CatalogTableDataProvider.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ final class CatalogTableDataProvider {
3333
FaceCaptureCameraPositionItem(),
3434
FaceCaptureHideTorchConfigurationItem(),
3535
LivenessSkipOnboardingAndSuccessItem(),
36-
36+
37+
LivenessUIConfigurationItem(),
38+
FaceCaptureUIConfigurationItem(),
3739
LivenessHintViewAppearanceItem(),
3840
LivenessHintPositionItem(),
3941
LivenessToolbarAppearanceItem(),
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
//
2+
// FaceCaptureUIConfiguration.swift
3+
// Catalog
4+
//
5+
// Created by Dmitry Evglevsky on 29.06.23.
6+
// Copyright © 2023 Regula. All rights reserved.
7+
//
8+
9+
import FaceSDK
10+
11+
final class FaceCaptureUIConfigurationItem: CatalogItem {
12+
override init() {
13+
super.init()
14+
15+
title = "FaceCapture UI Configuration"
16+
itemDescription = "Interface customization."
17+
category = .viewCustomization
18+
}
19+
20+
override func onItemSelected(from viewController: UIViewController) {
21+
let titleFont = UIFont(name: "Copperplate", size: 26)!
22+
23+
let interfaceConfiguration = UIConfiguration {
24+
// Camera screen colors.
25+
$0.setColor(.systemYellow, forItem: .CameraScreenStrokeActive)
26+
$0.setColor(.systemYellow, forItem: .CameraScreenStrokeNormal)
27+
$0.setColor(.systemYellow, forItem: .CameraScreenFrontHintLabelBackground)
28+
$0.setColor(.black, forItem: .CameraScreenFrontHintLabelText)
29+
30+
// Camera screen fonts.
31+
$0.setFont(titleFont, forItem: .CameraScreenHintLabel)
32+
}
33+
FaceSDK.service.customization.configuration = interfaceConfiguration
34+
35+
FaceSDK.service.presentFaceCaptureViewController(
36+
from: viewController,
37+
animated: true,
38+
onCapture: { [weak self, weak viewController] response in
39+
FaceSDK.service.customization.configuration = nil
40+
guard let self = self, let viewController = viewController else { return }
41+
self.showFaceCaptureResult(response, from: viewController)
42+
},
43+
completion: nil)
44+
}
45+
}
46+

Catalog/Items/ViewCustomization/LivenessHintViewAppearanceItem.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,14 @@ final class LivenessHintViewAppearanceItem: CatalogItem {
4545
private extension LivenessHintViewAppearanceItem {
4646
/// Restorins original appearance of the HintView.
4747
private func applyOriginalAppearance() {
48+
let lightGrayColor = UIColor(white: 0.91, alpha: 1.0)
49+
4850
let hintViewAppearance = HintView.appearance(whenContainedInInstancesOf: [LivenessContentView.self])
4951
hintViewAppearance.cornerRadius = 8
50-
hintViewAppearance.setBackgroundColor(.black, for: .front)
51-
hintViewAppearance.setTextColor(.white, for: .front)
52+
hintViewAppearance.setBackgroundColor(lightGrayColor, for: .front)
53+
hintViewAppearance.setTextColor(.black, for: .front)
5254

5355
let hintLabelAppearance = UILabel.appearance(whenContainedInInstancesOf: [HintView.self, LivenessContentView.self])
54-
hintLabelAppearance.font = .systemFont(ofSize: 30)
56+
hintLabelAppearance.font = .preferredFont(forTextStyle: .title2)
5557
}
5658
}

Catalog/Items/ViewCustomization/LivenessToolbarAppearanceItem.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ private extension LivenessToolbarAppearanceItem {
4242
/// Restorins original appearance.
4343
private func applyOriginalAppearance() {
4444
let toolbarAppearance = CameraToolbarView.appearance(whenContainedInInstancesOf: [LivenessContentView.self])
45-
toolbarAppearance.backgroundColor = .black
45+
toolbarAppearance.backgroundColor = .clear
4646

4747
let toolbarButtonAppearance = UIButton.appearance(whenContainedInInstancesOf: [CameraToolbarView.self, LivenessContentView.self])
4848
toolbarButtonAppearance.backgroundColor = nil

Catalog/Items/ViewCustomization/LivenessToolbarCustomButtonItem.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ final class LivenessToolbarCustomButtonItem: CatalogItem {
1818

1919
override init(frame: CGRect) {
2020
super.init(frame: frame)
21+
customCloseButton.backgroundColor = .windsor
2122
customCloseButton.setTitle("CLOSE", for: .normal)
2223
customCloseButton.titleLabel?.font = UIFont(name: "AmericanTypewriter", size: 30)
2324
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
//
2+
// LivenessUIConfiguration.swift
3+
// Catalog
4+
//
5+
// Created by Dmitry Evglevsky on 9.06.23.
6+
// Copyright © 2023 Regula. All rights reserved.
7+
//
8+
9+
import FaceSDK
10+
11+
final class LivenessUIConfigurationItem: CatalogItem {
12+
override init() {
13+
super.init()
14+
15+
title = "Liveness UI Configuration"
16+
itemDescription = "Interface customization."
17+
category = .viewCustomization
18+
}
19+
20+
override func onItemSelected(from viewController: UIViewController) {
21+
let messageFont = UIFont(name: "Copperplate", size: 18)!
22+
let titleFont = UIFont(name: "Copperplate", size: 26)!
23+
24+
let interfaceConfiguration = UIConfiguration {
25+
// Onboarding screen colors.
26+
$0.setColor(.systemYellow, forItem: .OnboardingScreenBackground)
27+
$0.setColor(.black, forItem: .OnboardingScreenStartButtonBackground)
28+
29+
// Onboarding screen fonts.
30+
$0.setFont(messageFont, forItem: .OnboardingScreenMessageLabel)
31+
$0.setFont(titleFont, forItem: .OnboardingScreenTitleLabel)
32+
$0.setFont(titleFont, forItem: .OnboardingScreenStartButton)
33+
34+
// Onboarding screen images.
35+
if #available(iOS 16.0, *) {
36+
$0.setImage(UIImage(systemName: "sun.max.trianglebadge.exclamationmark")!.withTintColor(.black, renderingMode: .alwaysOriginal),
37+
forItem: .OnboardingScreenIllumination)
38+
$0.setImage(UIImage(systemName: "eyeglasses")!.withTintColor(.black, renderingMode: .alwaysOriginal),
39+
forItem: .OnboardingScreenAccessories)
40+
$0.setImage(UIImage(systemName: "camera.viewfinder")!.withTintColor(.black, renderingMode: .alwaysOriginal),
41+
forItem: .OnboardingScreenCameraLevel)
42+
} else {
43+
// Use your image assets.
44+
}
45+
46+
// Camera screen colors.
47+
$0.setColor(.systemYellow, forItem: .CameraScreenStrokeActive)
48+
$0.setColor(.systemYellow, forItem: .CameraScreenStrokeNormal)
49+
$0.setColor(.systemYellow, forItem: .CameraScreenSectorActive)
50+
$0.setColor(.systemYellow.withAlphaComponent(0.35), forItem: .CameraScreenSectorTarget)
51+
$0.setColor(.systemYellow, forItem: .CameraScreenFrontHintLabelBackground)
52+
$0.setColor(.black, forItem: .CameraScreenFrontHintLabelText)
53+
54+
// Camera screen fonts.
55+
$0.setFont(titleFont, forItem: .CameraScreenHintLabel)
56+
57+
// Processing screen colors.
58+
$0.setColor(.systemYellow, forItem: .ProcessingScreenBackground)
59+
$0.setColor(.black, forItem: .ProcessingScreenProgress)
60+
$0.setColor(.black, forItem: .ProcessingScreenTitleLabel)
61+
62+
// Processing screen fonts.
63+
$0.setFont(titleFont, forItem: .ProcessingScreenLabel)
64+
65+
// Retry screen colors.
66+
$0.setColor(.systemYellow, forItem: .RetryScreenBackground)
67+
$0.setColor(.black, forItem: .RetryScreenRetryButtonBackground)
68+
69+
// Retry screen fonts.
70+
$0.setFont(messageFont, forItem: .RetryScreenHintLabels)
71+
$0.setFont(titleFont, forItem: .RetryScreenTitleLabel)
72+
$0.setFont(titleFont, forItem: .RetryScreenRetryButton)
73+
74+
// Retry screen images.
75+
if #available(iOS 16.0, *) {
76+
$0.setImage(UIImage(systemName: "sun.max.trianglebadge.exclamationmark")!.withTintColor(.black, renderingMode: .alwaysOriginal),
77+
forItem: .RetryScreenHintEnvironment)
78+
$0.setImage(UIImage(systemName: "face.smiling")!.withTintColor(.black, renderingMode: .alwaysOriginal),
79+
forItem: .RetryScreenHintSubject)
80+
} else {
81+
// Use your image assets.
82+
}
83+
84+
// Success screen colors.
85+
$0.setColor(.systemYellow, forItem: .SuccessScreenBackground)
86+
87+
// Success screen images.
88+
$0.setImage(UIImage(named: "checkmark")!, forItem: .SuccessScreenImage)
89+
}
90+
FaceSDK.service.customization.configuration = interfaceConfiguration
91+
92+
FaceSDK.service.startLiveness(
93+
from: viewController,
94+
animated: true,
95+
onLiveness: { [weak self, weak viewController] response in
96+
FaceSDK.service.customization.configuration = nil
97+
guard let self = self, let viewController = viewController else { return }
98+
self.showLivenessResult(response, from: viewController)
99+
},
100+
completion: nil)
101+
}
102+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "checkmark.pdf",
5+
"idiom" : "universal"
6+
}
7+
],
8+
"info" : {
9+
"author" : "xcode",
10+
"version" : 1
11+
}
12+
}
Binary file not shown.
-256 KB
Binary file not shown.

0 commit comments

Comments
 (0)