Removing old UIKit code

This commit is contained in:
Selim Mustafaev 2025-04-29 18:28:29 +03:00
parent 72ce7ec798
commit e3ed146f5c
13 changed files with 20 additions and 914 deletions

View File

@ -16,7 +16,6 @@
7A1022722C554A1300B84627 /* CustomHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1022712C554A1300B84627 /* CustomHostingController.swift */; }; 7A1022722C554A1300B84627 /* CustomHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1022712C554A1300B84627 /* CustomHostingController.swift */; };
7A1022772C557EC400B84627 /* LocationPickerScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1022762C557EC400B84627 /* LocationPickerScreen.swift */; }; 7A1022772C557EC400B84627 /* LocationPickerScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1022762C557EC400B84627 /* LocationPickerScreen.swift */; };
7A1022792C557ED600B84627 /* LocationPickerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1022782C557ED600B84627 /* LocationPickerViewModel.swift */; }; 7A1022792C557ED600B84627 /* LocationPickerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1022782C557ED600B84627 /* LocationPickerViewModel.swift */; };
7A1090EC24A4E3E100B4F0B2 /* CellProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1090EB24A4E3E100B4F0B2 /* CellProgressView.swift */; };
7A11470A23FDE7E600B424AF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7A11470923FDE7E600B424AF /* Assets.xcassets */; }; 7A11470A23FDE7E600B424AF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7A11470923FDE7E600B424AF /* Assets.xcassets */; };
7A131FD32D37B75500DC7755 /* HistoryScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A131FD22D37B75500DC7755 /* HistoryScreen.swift */; }; 7A131FD32D37B75500DC7755 /* HistoryScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A131FD22D37B75500DC7755 /* HistoryScreen.swift */; };
7A131FD52D37B76A00DC7755 /* HistoryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A131FD42D37B76A00DC7755 /* HistoryViewModel.swift */; }; 7A131FD52D37B76A00DC7755 /* HistoryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A131FD42D37B76A00DC7755 /* HistoryViewModel.swift */; };
@ -25,7 +24,6 @@
7A17CE4A2A2E820300626A6E /* UIStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A17CE492A2E820300626A6E /* UIStackView.swift */; }; 7A17CE4A2A2E820300626A6E /* UIStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A17CE492A2E820300626A6E /* UIStackView.swift */; };
7A17CE4C2A2E850200626A6E /* UISegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A17CE4B2A2E850200626A6E /* UISegmentedControl.swift */; }; 7A17CE4C2A2E850200626A6E /* UISegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A17CE4B2A2E850200626A6E /* UISegmentedControl.swift */; };
7A1CF81629A42117007962DA /* Realm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1CF81529A42117007962DA /* Realm.swift */; }; 7A1CF81629A42117007962DA /* Realm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1CF81529A42117007962DA /* Realm.swift */; };
7A1DC38E2517ED98002E9C99 /* BlockBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1DC38D2517ED98002E9C99 /* BlockBarButtonItem.swift */; };
7A1E78F62CE900330004B740 /* ReportScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1E78F52CE900330004B740 /* ReportScreen.swift */; }; 7A1E78F62CE900330004B740 /* ReportScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1E78F52CE900330004B740 /* ReportScreen.swift */; };
7A1E78F82CE900440004B740 /* ReportViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1E78F72CE900440004B740 /* ReportViewModel.swift */; }; 7A1E78F82CE900440004B740 /* ReportViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1E78F72CE900440004B740 /* ReportViewModel.swift */; };
7A1E78FF2CE91A740004B740 /* Vehicle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1E78FE2CE91A740004B740 /* Vehicle.swift */; }; 7A1E78FF2CE91A740004B740 /* Vehicle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1E78FE2CE91A740004B740 /* Vehicle.swift */; };
@ -81,10 +79,8 @@
7A6B65B32CFB0DB500AABA6B /* NullifyDate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6B65B22CFB0DB500AABA6B /* NullifyDate.swift */; }; 7A6B65B32CFB0DB500AABA6B /* NullifyDate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6B65B22CFB0DB500AABA6B /* NullifyDate.swift */; };
7A6C4D9E2C56BCA600982597 /* SwiftLocation in Frameworks */ = {isa = PBXBuildFile; productRef = 7A6C4D9D2C56BCA600982597 /* SwiftLocation */; }; 7A6C4D9E2C56BCA600982597 /* SwiftLocation in Frameworks */ = {isa = PBXBuildFile; productRef = 7A6C4D9D2C56BCA600982597 /* SwiftLocation */; };
7A6C65222D999325001240C2 /* AudioRecordViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6C65212D999325001240C2 /* AudioRecordViewModel.swift */; }; 7A6C65222D999325001240C2 /* AudioRecordViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6C65212D999325001240C2 /* AudioRecordViewModel.swift */; };
7A6DD903242BF4A5009DE740 /* PlateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD902242BF4A5009DE740 /* PlateView.swift */; };
7A6DD90824329144009DE740 /* CenterTextLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD90724329144009DE740 /* CenterTextLayer.swift */; }; 7A6DD90824329144009DE740 /* CenterTextLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD90724329144009DE740 /* CenterTextLayer.swift */; };
7A6DD90A24329541009DE740 /* RoadNumbers2.0.otf in Resources */ = {isa = PBXBuildFile; fileRef = 7A6DD90924329541009DE740 /* RoadNumbers2.0.otf */; }; 7A6DD90A24329541009DE740 /* RoadNumbers2.0.otf in Resources */ = {isa = PBXBuildFile; fileRef = 7A6DD90924329541009DE740 /* RoadNumbers2.0.otf */; };
7A6DD90C24335A6D009DE740 /* FlagLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD90B24335A6D009DE740 /* FlagLayer.swift */; };
7A6F096026DBF588003A965D /* VehicleNote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6F095F26DBF588003A965D /* VehicleNote.swift */; }; 7A6F096026DBF588003A965D /* VehicleNote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6F095F26DBF588003A965D /* VehicleNote.swift */; };
7A7097C22C9EC139007CFDCA /* ServiceContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A7097C12C9EC139007CFDCA /* ServiceContainer.swift */; }; 7A7097C22C9EC139007CFDCA /* ServiceContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A7097C12C9EC139007CFDCA /* ServiceContainer.swift */; };
7A7158002C43EA6900852088 /* OwnersScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A7157FF2C43EA6900852088 /* OwnersScreen.swift */; }; 7A7158002C43EA6900852088 /* OwnersScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A7157FF2C43EA6900852088 /* OwnersScreen.swift */; };
@ -140,8 +136,6 @@
7AB587322C42D38E00FA7B66 /* StorageServiceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB587312C42D38E00FA7B66 /* StorageServiceProtocol.swift */; }; 7AB587322C42D38E00FA7B66 /* StorageServiceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB587312C42D38E00FA7B66 /* StorageServiceProtocol.swift */; };
7AB587342C42D3FA00FA7B66 /* StorageService+Notes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB587332C42D3FA00FA7B66 /* StorageService+Notes.swift */; }; 7AB587342C42D3FA00FA7B66 /* StorageService+Notes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB587332C42D3FA00FA7B66 /* StorageService+Notes.swift */; };
7AB587412C42FFE200FA7B66 /* ApiServiceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB587402C42FFE200FA7B66 /* ApiServiceProtocol.swift */; }; 7AB587412C42FFE200FA7B66 /* ApiServiceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB587402C42FFE200FA7B66 /* ApiServiceProtocol.swift */; };
7AB67E8C2435C38700258F61 /* CustomTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB67E8B2435C38700258F61 /* CustomTextField.swift */; };
7AB67E8E2435D1A000258F61 /* CustomButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB67E8D2435D1A000258F61 /* CustomButton.swift */; };
7AB9FE222D08C2A5005DE374 /* EventsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB9FE212D08C2A5005DE374 /* EventsScreen.swift */; }; 7AB9FE222D08C2A5005DE374 /* EventsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB9FE212D08C2A5005DE374 /* EventsScreen.swift */; };
7AB9FE282D08C2F4005DE374 /* EventsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB9FE272D08C2F4005DE374 /* EventsViewModel.swift */; }; 7AB9FE282D08C2F4005DE374 /* EventsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB9FE272D08C2F4005DE374 /* EventsViewModel.swift */; };
7AB9FE2A2D08CF35005DE374 /* EventsScreenMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB9FE292D08CF35005DE374 /* EventsScreenMode.swift */; }; 7AB9FE2A2D08CF35005DE374 /* EventsScreenMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB9FE292D08CF35005DE374 /* EventsScreenMode.swift */; };
@ -153,7 +147,6 @@
7ABDA80D2D8721B10083C715 /* Substrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ABDA80C2D8721B10083C715 /* Substrings.swift */; }; 7ABDA80D2D8721B10083C715 /* Substrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ABDA80C2D8721B10083C715 /* Substrings.swift */; };
7ABDA80F2D8723F90083C715 /* StorageService+AudioRecords.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ABDA80E2D8723F90083C715 /* StorageService+AudioRecords.swift */; }; 7ABDA80F2D8723F90083C715 /* StorageService+AudioRecords.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ABDA80E2D8723F90083C715 /* StorageService+AudioRecords.swift */; };
7AC3554A2969652F00889457 /* SwiftEntryKit in Frameworks */ = {isa = PBXBuildFile; productRef = 7AC355492969652F00889457 /* SwiftEntryKit */; }; 7AC3554A2969652F00889457 /* SwiftEntryKit in Frameworks */ = {isa = PBXBuildFile; productRef = 7AC355492969652F00889457 /* SwiftEntryKit */; };
7AC3555029696D5A00889457 /* NewNumberController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC3554F29696D5A00889457 /* NewNumberController.swift */; };
7AC35554296973E100889457 /* ACButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC35553296973E100889457 /* ACButton.swift */; }; 7AC35554296973E100889457 /* ACButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC35553296973E100889457 /* ACButton.swift */; };
7AC355592969746600889457 /* UIControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC355582969746600889457 /* UIControl.swift */; }; 7AC355592969746600889457 /* UIControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC355582969746600889457 /* UIControl.swift */; };
7AC3555B296995B200889457 /* UIEdgeInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC3555A296995B200889457 /* UIEdgeInsets.swift */; }; 7AC3555B296995B200889457 /* UIEdgeInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC3555A296995B200889457 /* UIEdgeInsets.swift */; };
@ -164,9 +157,8 @@
7AC8B2762D6A01C700190706 /* UISearchTextField+Dumb.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC8B2752D6A01C700190706 /* UISearchTextField+Dumb.swift */; }; 7AC8B2762D6A01C700190706 /* UISearchTextField+Dumb.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC8B2752D6A01C700190706 /* UISearchTextField+Dumb.swift */; };
7ACBB91E2CB9B155005A5168 /* Mockable in Frameworks */ = {isa = PBXBuildFile; productRef = 7ACBB91D2CB9B155005A5168 /* Mockable */; }; 7ACBB91E2CB9B155005A5168 /* Mockable in Frameworks */ = {isa = PBXBuildFile; productRef = 7ACBB91D2CB9B155005A5168 /* Mockable */; };
7ACBB9202CB9B16C005A5168 /* Mockable in Frameworks */ = {isa = PBXBuildFile; productRef = 7ACBB91F2CB9B16C005A5168 /* Mockable */; }; 7ACBB9202CB9B16C005A5168 /* Mockable in Frameworks */ = {isa = PBXBuildFile; productRef = 7ACBB91F2CB9B16C005A5168 /* Mockable */; };
7AD176AD2DC110830023049D /* Environment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AD176AC2DC110830023049D /* Environment.swift */; }; 7AD176B02DC127540023049D /* PNButtonType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AD176AF2DC127540023049D /* PNButtonType.swift */; };
7ADCBC572DB51739002522C0 /* AutoCatApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADCBC562DB51739002522C0 /* AutoCatApp.swift */; }; 7ADCBC572DB51739002522C0 /* AutoCatApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADCBC562DB51739002522C0 /* AutoCatApp.swift */; };
7ADF6C97250F41B000F237B2 /* PNKeyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADF6C96250F41B000F237B2 /* PNKeyboard.swift */; };
7ADF6C99250F872C00F237B2 /* RoadNumbers.otf in Resources */ = {isa = PBXBuildFile; fileRef = 7ADF6C98250F872C00F237B2 /* RoadNumbers.otf */; }; 7ADF6C99250F872C00F237B2 /* RoadNumbers.otf in Resources */ = {isa = PBXBuildFile; fileRef = 7ADF6C98250F872C00F237B2 /* RoadNumbers.otf */; };
7ADF6CA12512244400F237B2 /* MapExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADF6CA02512244400F237B2 /* MapExt.swift */; }; 7ADF6CA12512244400F237B2 /* MapExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADF6CA02512244400F237B2 /* MapExt.swift */; };
7ADFC9572DAD0288001A43E3 /* GoogleAuthScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADFC9562DAD0288001A43E3 /* GoogleAuthScreen.swift */; }; 7ADFC9572DAD0288001A43E3 /* GoogleAuthScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADFC9562DAD0288001A43E3 /* GoogleAuthScreen.swift */; };
@ -270,7 +262,6 @@
7A1022712C554A1300B84627 /* CustomHostingController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomHostingController.swift; sourceTree = "<group>"; }; 7A1022712C554A1300B84627 /* CustomHostingController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomHostingController.swift; sourceTree = "<group>"; };
7A1022762C557EC400B84627 /* LocationPickerScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationPickerScreen.swift; sourceTree = "<group>"; }; 7A1022762C557EC400B84627 /* LocationPickerScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationPickerScreen.swift; sourceTree = "<group>"; };
7A1022782C557ED600B84627 /* LocationPickerViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationPickerViewModel.swift; sourceTree = "<group>"; }; 7A1022782C557ED600B84627 /* LocationPickerViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationPickerViewModel.swift; sourceTree = "<group>"; };
7A1090EB24A4E3E100B4F0B2 /* CellProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CellProgressView.swift; sourceTree = "<group>"; };
7A1146FD23FDE7E500B424AF /* AutoCat.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AutoCat.app; sourceTree = BUILT_PRODUCTS_DIR; }; 7A1146FD23FDE7E500B424AF /* AutoCat.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AutoCat.app; sourceTree = BUILT_PRODUCTS_DIR; };
7A11470923FDE7E600B424AF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 7A11470923FDE7E600B424AF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
7A11470E23FDE7E600B424AF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 7A11470E23FDE7E600B424AF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@ -286,7 +277,6 @@
7A17CE492A2E820300626A6E /* UIStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIStackView.swift; sourceTree = "<group>"; }; 7A17CE492A2E820300626A6E /* UIStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIStackView.swift; sourceTree = "<group>"; };
7A17CE4B2A2E850200626A6E /* UISegmentedControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UISegmentedControl.swift; sourceTree = "<group>"; }; 7A17CE4B2A2E850200626A6E /* UISegmentedControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UISegmentedControl.swift; sourceTree = "<group>"; };
7A1CF81529A42117007962DA /* Realm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Realm.swift; sourceTree = "<group>"; }; 7A1CF81529A42117007962DA /* Realm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Realm.swift; sourceTree = "<group>"; };
7A1DC38D2517ED98002E9C99 /* BlockBarButtonItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockBarButtonItem.swift; sourceTree = "<group>"; };
7A1E78F52CE900330004B740 /* ReportScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportScreen.swift; sourceTree = "<group>"; }; 7A1E78F52CE900330004B740 /* ReportScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportScreen.swift; sourceTree = "<group>"; };
7A1E78F72CE900440004B740 /* ReportViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportViewModel.swift; sourceTree = "<group>"; }; 7A1E78F72CE900440004B740 /* ReportViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportViewModel.swift; sourceTree = "<group>"; };
7A1E78FE2CE91A740004B740 /* Vehicle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Vehicle.swift; sourceTree = "<group>"; }; 7A1E78FE2CE91A740004B740 /* Vehicle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Vehicle.swift; sourceTree = "<group>"; };
@ -350,10 +340,8 @@
7A659B5824A2B1BA0043A0F2 /* AudioRecord.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecord.swift; sourceTree = "<group>"; }; 7A659B5824A2B1BA0043A0F2 /* AudioRecord.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecord.swift; sourceTree = "<group>"; };
7A6B65B22CFB0DB500AABA6B /* NullifyDate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NullifyDate.swift; sourceTree = "<group>"; }; 7A6B65B22CFB0DB500AABA6B /* NullifyDate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NullifyDate.swift; sourceTree = "<group>"; };
7A6C65212D999325001240C2 /* AudioRecordViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecordViewModel.swift; sourceTree = "<group>"; }; 7A6C65212D999325001240C2 /* AudioRecordViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecordViewModel.swift; sourceTree = "<group>"; };
7A6DD902242BF4A5009DE740 /* PlateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlateView.swift; sourceTree = "<group>"; };
7A6DD90724329144009DE740 /* CenterTextLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CenterTextLayer.swift; sourceTree = "<group>"; }; 7A6DD90724329144009DE740 /* CenterTextLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CenterTextLayer.swift; sourceTree = "<group>"; };
7A6DD90924329541009DE740 /* RoadNumbers2.0.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = RoadNumbers2.0.otf; sourceTree = "<group>"; }; 7A6DD90924329541009DE740 /* RoadNumbers2.0.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = RoadNumbers2.0.otf; sourceTree = "<group>"; };
7A6DD90B24335A6D009DE740 /* FlagLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlagLayer.swift; sourceTree = "<group>"; };
7A6DD90D24337930009DE740 /* PlateNumber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlateNumber.swift; sourceTree = "<group>"; }; 7A6DD90D24337930009DE740 /* PlateNumber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlateNumber.swift; sourceTree = "<group>"; };
7A6F095F26DBF588003A965D /* VehicleNote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehicleNote.swift; sourceTree = "<group>"; }; 7A6F095F26DBF588003A965D /* VehicleNote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehicleNote.swift; sourceTree = "<group>"; };
7A7097C12C9EC139007CFDCA /* ServiceContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceContainer.swift; sourceTree = "<group>"; }; 7A7097C12C9EC139007CFDCA /* ServiceContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceContainer.swift; sourceTree = "<group>"; };
@ -406,8 +394,6 @@
7AB587312C42D38E00FA7B66 /* StorageServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageServiceProtocol.swift; sourceTree = "<group>"; }; 7AB587312C42D38E00FA7B66 /* StorageServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageServiceProtocol.swift; sourceTree = "<group>"; };
7AB587332C42D3FA00FA7B66 /* StorageService+Notes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StorageService+Notes.swift"; sourceTree = "<group>"; }; 7AB587332C42D3FA00FA7B66 /* StorageService+Notes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StorageService+Notes.swift"; sourceTree = "<group>"; };
7AB587402C42FFE200FA7B66 /* ApiServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApiServiceProtocol.swift; sourceTree = "<group>"; }; 7AB587402C42FFE200FA7B66 /* ApiServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApiServiceProtocol.swift; sourceTree = "<group>"; };
7AB67E8B2435C38700258F61 /* CustomTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTextField.swift; sourceTree = "<group>"; };
7AB67E8D2435D1A000258F61 /* CustomButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomButton.swift; sourceTree = "<group>"; };
7AB9FE212D08C2A5005DE374 /* EventsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventsScreen.swift; sourceTree = "<group>"; }; 7AB9FE212D08C2A5005DE374 /* EventsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventsScreen.swift; sourceTree = "<group>"; };
7AB9FE272D08C2F4005DE374 /* EventsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventsViewModel.swift; sourceTree = "<group>"; }; 7AB9FE272D08C2F4005DE374 /* EventsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventsViewModel.swift; sourceTree = "<group>"; };
7AB9FE292D08CF35005DE374 /* EventsScreenMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventsScreenMode.swift; sourceTree = "<group>"; }; 7AB9FE292D08CF35005DE374 /* EventsScreenMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventsScreenMode.swift; sourceTree = "<group>"; };
@ -418,7 +404,6 @@
7ABDA80A2D8715DC0083C715 /* VehicleRecordError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehicleRecordError.swift; sourceTree = "<group>"; }; 7ABDA80A2D8715DC0083C715 /* VehicleRecordError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehicleRecordError.swift; sourceTree = "<group>"; };
7ABDA80C2D8721B10083C715 /* Substrings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Substrings.swift; sourceTree = "<group>"; }; 7ABDA80C2D8721B10083C715 /* Substrings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Substrings.swift; sourceTree = "<group>"; };
7ABDA80E2D8723F90083C715 /* StorageService+AudioRecords.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StorageService+AudioRecords.swift"; sourceTree = "<group>"; }; 7ABDA80E2D8723F90083C715 /* StorageService+AudioRecords.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StorageService+AudioRecords.swift"; sourceTree = "<group>"; };
7AC3554F29696D5A00889457 /* NewNumberController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewNumberController.swift; sourceTree = "<group>"; };
7AC35553296973E100889457 /* ACButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ACButton.swift; sourceTree = "<group>"; }; 7AC35553296973E100889457 /* ACButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ACButton.swift; sourceTree = "<group>"; };
7AC355582969746600889457 /* UIControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIControl.swift; sourceTree = "<group>"; }; 7AC355582969746600889457 /* UIControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIControl.swift; sourceTree = "<group>"; };
7AC3555A296995B200889457 /* UIEdgeInsets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIEdgeInsets.swift; sourceTree = "<group>"; }; 7AC3555A296995B200889457 /* UIEdgeInsets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIEdgeInsets.swift; sourceTree = "<group>"; };
@ -427,9 +412,8 @@
7AC44B892DB4395300ADC026 /* SearchSplitScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchSplitScreen.swift; sourceTree = "<group>"; }; 7AC44B892DB4395300ADC026 /* SearchSplitScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchSplitScreen.swift; sourceTree = "<group>"; };
7AC76D7A270083AE0084DB27 /* TextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextView.swift; sourceTree = "<group>"; }; 7AC76D7A270083AE0084DB27 /* TextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextView.swift; sourceTree = "<group>"; };
7AC8B2752D6A01C700190706 /* UISearchTextField+Dumb.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UISearchTextField+Dumb.swift"; sourceTree = "<group>"; }; 7AC8B2752D6A01C700190706 /* UISearchTextField+Dumb.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UISearchTextField+Dumb.swift"; sourceTree = "<group>"; };
7AD176AC2DC110830023049D /* Environment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Environment.swift; sourceTree = "<group>"; }; 7AD176AF2DC127540023049D /* PNButtonType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PNButtonType.swift; sourceTree = "<group>"; };
7ADCBC562DB51739002522C0 /* AutoCatApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoCatApp.swift; sourceTree = "<group>"; }; 7ADCBC562DB51739002522C0 /* AutoCatApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoCatApp.swift; sourceTree = "<group>"; };
7ADF6C96250F41B000F237B2 /* PNKeyboard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PNKeyboard.swift; sourceTree = "<group>"; };
7ADF6C98250F872C00F237B2 /* RoadNumbers.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = RoadNumbers.otf; sourceTree = "<group>"; }; 7ADF6C98250F872C00F237B2 /* RoadNumbers.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = RoadNumbers.otf; sourceTree = "<group>"; };
7ADF6CA02512244400F237B2 /* MapExt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapExt.swift; sourceTree = "<group>"; }; 7ADF6CA02512244400F237B2 /* MapExt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapExt.swift; sourceTree = "<group>"; };
7ADFC9562DAD0288001A43E3 /* GoogleAuthScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoogleAuthScreen.swift; sourceTree = "<group>"; }; 7ADFC9562DAD0288001A43E3 /* GoogleAuthScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoogleAuthScreen.swift; sourceTree = "<group>"; };
@ -588,13 +572,11 @@
7AB587352C42E3BF00FA7B66 /* Preview */, 7AB587352C42E3BF00FA7B66 /* Preview */,
7AFBE8C52C30812E003C491D /* SwiftUI */, 7AFBE8C52C30812E003C491D /* SwiftUI */,
7AC355552969742800889457 /* ACUIKit */, 7AC355552969742800889457 /* ACUIKit */,
7A11471423FDEAF800B424AF /* Controllers */,
7A1441632C297E9800E79018 /* Screens */, 7A1441632C297E9800E79018 /* Screens */,
7A3F07A924360D9100E59687 /* Extensions */, 7A3F07A924360D9100E59687 /* Extensions */,
7A6DD90424326788009DE740 /* Fonts */, 7A6DD90424326788009DE740 /* Fonts */,
7A11472C23FECA3E00B424AF /* ThirdParty */, 7A11472C23FECA3E00B424AF /* ThirdParty */,
7A11474223FF06B600B424AF /* Utils */, 7A11474223FF06B600B424AF /* Utils */,
7A6DD901242BF48D009DE740 /* Views */,
7A64AE6B2469DC6900ABE48E /* AutoCat.entitlements */, 7A64AE6B2469DC6900ABE48E /* AutoCat.entitlements */,
7A11470E23FDE7E600B424AF /* Info.plist */, 7A11470E23FDE7E600B424AF /* Info.plist */,
7A11470923FDE7E600B424AF /* Assets.xcassets */, 7A11470923FDE7E600B424AF /* Assets.xcassets */,
@ -606,14 +588,6 @@
path = AutoCat; path = AutoCat;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
7A11471423FDEAF800B424AF /* Controllers */ = {
isa = PBXGroup;
children = (
7AC3554F29696D5A00889457 /* NewNumberController.swift */,
);
path = Controllers;
sourceTree = "<group>";
};
7A11472C23FECA3E00B424AF /* ThirdParty */ = { 7A11472C23FECA3E00B424AF /* ThirdParty */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -858,20 +832,6 @@
path = AudioRecordView; path = AudioRecordView;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
7A6DD901242BF48D009DE740 /* Views */ = {
isa = PBXGroup;
children = (
7A6DD902242BF4A5009DE740 /* PlateView.swift */,
7A6DD90B24335A6D009DE740 /* FlagLayer.swift */,
7AB67E8B2435C38700258F61 /* CustomTextField.swift */,
7AB67E8D2435D1A000258F61 /* CustomButton.swift */,
7A1090EB24A4E3E100B4F0B2 /* CellProgressView.swift */,
7ADF6C96250F41B000F237B2 /* PNKeyboard.swift */,
7A1DC38D2517ED98002E9C99 /* BlockBarButtonItem.swift */,
);
path = Views;
sourceTree = "<group>";
};
7A6DD90424326788009DE740 /* Fonts */ = { 7A6DD90424326788009DE740 /* Fonts */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -1074,6 +1034,17 @@
path = MainScreen; path = MainScreen;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
7AD176AE2DC127290023049D /* NumberEditView */ = {
isa = PBXGroup;
children = (
7AD176AF2DC127540023049D /* PNButtonType.swift */,
7AB490282D6B1217002F39C6 /* ACKeyboardView.swift */,
7AB4902A2D6B1446002F39C6 /* ACKeyboardButton.swift */,
7A589E0E2D6B6E8E00EF3FBE /* NumberEditView.swift */,
);
path = NumberEditView;
sourceTree = "<group>";
};
7ADFC9552DAD026C001A43E3 /* GoogleAuthScreen */ = { 7ADFC9552DAD026C001A43E3 /* GoogleAuthScreen */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -1136,6 +1107,7 @@
7AFBE8C52C30812E003C491D /* SwiftUI */ = { 7AFBE8C52C30812E003C491D /* SwiftUI */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
7AD176AE2DC127290023049D /* NumberEditView */,
7AAAFAD12C4D0FB00050410D /* ACImageSlider */, 7AAAFAD12C4D0FB00050410D /* ACImageSlider */,
7AFBE8C62C30814E003C491D /* ACProgressHud */, 7AFBE8C62C30814E003C491D /* ACProgressHud */,
7A961C6B2C4C3C8600CE2211 /* TextRowView.swift */, 7A961C6B2C4C3C8600CE2211 /* TextRowView.swift */,
@ -1150,11 +1122,7 @@
7A912F362D381B7400002938 /* LicensePlateView.swift */, 7A912F362D381B7400002938 /* LicensePlateView.swift */,
7AB4E42B2D397D8E0006D052 /* VehicleCellView.swift */, 7AB4E42B2D397D8E0006D052 /* VehicleCellView.swift */,
7AC8B2752D6A01C700190706 /* UISearchTextField+Dumb.swift */, 7AC8B2752D6A01C700190706 /* UISearchTextField+Dumb.swift */,
7AB490282D6B1217002F39C6 /* ACKeyboardView.swift */,
7AB4902A2D6B1446002F39C6 /* ACKeyboardButton.swift */,
7A589E0E2D6B6E8E00EF3FBE /* NumberEditView.swift */,
7AF231982DA27C1B00AE5EB3 /* ACButtonView.swift */, 7AF231982DA27C1B00AE5EB3 /* ACButtonView.swift */,
7AD176AC2DC110830023049D /* Environment.swift */,
); );
path = SwiftUI; path = SwiftUI;
sourceTree = "<group>"; sourceTree = "<group>";
@ -1386,7 +1354,6 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
7A961C6C2C4C3C8600CE2211 /* TextRowView.swift in Sources */, 7A961C6C2C4C3C8600CE2211 /* TextRowView.swift in Sources */,
7AD176AD2DC110830023049D /* Environment.swift in Sources */,
7A1022772C557EC400B84627 /* LocationPickerScreen.swift in Sources */, 7A1022772C557EC400B84627 /* LocationPickerScreen.swift in Sources */,
7A4322932CB2CCAA00085CF6 /* FiltersViewModel.swift in Sources */, 7A4322932CB2CCAA00085CF6 /* FiltersViewModel.swift in Sources */,
7A5D7E0C2C71EB25002C17E7 /* ToggleRowView.swift in Sources */, 7A5D7E0C2C71EB25002C17E7 /* ToggleRowView.swift in Sources */,
@ -1399,10 +1366,7 @@
7AAAFADA2C4D1AFE0050410D /* Zoomable.swift in Sources */, 7AAAFADA2C4D1AFE0050410D /* Zoomable.swift in Sources */,
7ADFC9572DAD0288001A43E3 /* GoogleAuthScreen.swift in Sources */, 7ADFC9572DAD0288001A43E3 /* GoogleAuthScreen.swift in Sources */,
7AC8B2762D6A01C700190706 /* UISearchTextField+Dumb.swift in Sources */, 7AC8B2762D6A01C700190706 /* UISearchTextField+Dumb.swift in Sources */,
7A6DD90C24335A6D009DE740 /* FlagLayer.swift in Sources */,
7A2E11292CCE395300E5CA17 /* OptionalDatePicker.swift in Sources */, 7A2E11292CCE395300E5CA17 /* OptionalDatePicker.swift in Sources */,
7AC3555029696D5A00889457 /* NewNumberController.swift in Sources */,
7AB67E8C2435C38700258F61 /* CustomTextField.swift in Sources */,
7AF860702CBAA24500954D2F /* NavigationLink.swift in Sources */, 7AF860702CBAA24500954D2F /* NavigationLink.swift in Sources */,
7ADCBC572DB51739002522C0 /* AutoCatApp.swift in Sources */, 7ADCBC572DB51739002522C0 /* AutoCatApp.swift in Sources */,
7AFFF7A02DBAAFF300EE2DEE /* SideBarItem.swift in Sources */, 7AFFF7A02DBAAFF300EE2DEE /* SideBarItem.swift in Sources */,
@ -1413,7 +1377,6 @@
7A4927D52CCE438600851C01 /* OptionalBinding.swift in Sources */, 7A4927D52CCE438600851C01 /* OptionalBinding.swift in Sources */,
7A5911EE2D63226F00EC51BA /* SearchScreen.swift in Sources */, 7A5911EE2D63226F00EC51BA /* SearchScreen.swift in Sources */,
7A17CE4A2A2E820300626A6E /* UIStackView.swift in Sources */, 7A17CE4A2A2E820300626A6E /* UIStackView.swift in Sources */,
7A1DC38E2517ED98002E9C99 /* BlockBarButtonItem.swift in Sources */,
7AC44B882DB438F200ADC026 /* UIView+layout.swift in Sources */, 7AC44B882DB438F200ADC026 /* UIView+layout.swift in Sources */,
7A6C65222D999325001240C2 /* AudioRecordViewModel.swift in Sources */, 7A6C65222D999325001240C2 /* AudioRecordViewModel.swift in Sources */,
7A06E0AE2C7065C7005731AC /* SettingsViewModel.swift in Sources */, 7A06E0AE2C7065C7005731AC /* SettingsViewModel.swift in Sources */,
@ -1422,6 +1385,7 @@
7ADF6CA12512244400F237B2 /* MapExt.swift in Sources */, 7ADF6CA12512244400F237B2 /* MapExt.swift in Sources */,
7AC44B822DB390B900ADC026 /* MainTabScreen.swift in Sources */, 7AC44B822DB390B900ADC026 /* MainTabScreen.swift in Sources */,
7A7158122C444A6400852088 /* AdsViewModel.swift in Sources */, 7A7158122C444A6400852088 /* AdsViewModel.swift in Sources */,
7AD176B02DC127540023049D /* PNButtonType.swift in Sources */,
7AF231952DA1C29300AE5EB3 /* AuthViewModel.swift in Sources */, 7AF231952DA1C29300AE5EB3 /* AuthViewModel.swift in Sources */,
7AB4E4662D58A16C0006D052 /* GenericError.swift in Sources */, 7AB4E4662D58A16C0006D052 /* GenericError.swift in Sources */,
7AFBE8CA2C3081C7003C491D /* ACProgressHud+Modifiers.swift in Sources */, 7AFBE8CA2C3081C7003C491D /* ACProgressHud+Modifiers.swift in Sources */,
@ -1439,10 +1403,8 @@
7A2C96122C3B155B00AE46B5 /* NoteAlertModifier.swift in Sources */, 7A2C96122C3B155B00AE46B5 /* NoteAlertModifier.swift in Sources */,
7AE24C5F251F1B4E00758E39 /* Buttons.swift in Sources */, 7AE24C5F251F1B4E00758E39 /* Buttons.swift in Sources */,
7A7DADAC2D99738300F52F6C /* AudioRecordView.swift in Sources */, 7A7DADAC2D99738300F52F6C /* AudioRecordView.swift in Sources */,
7A1090EC24A4E3E100B4F0B2 /* CellProgressView.swift in Sources */,
7AB9FE2A2D08CF35005DE374 /* EventsScreenMode.swift in Sources */, 7AB9FE2A2D08CF35005DE374 /* EventsScreenMode.swift in Sources */,
7AB490292D6B1217002F39C6 /* ACKeyboardView.swift in Sources */, 7AB490292D6B1217002F39C6 /* ACKeyboardView.swift in Sources */,
7A6DD903242BF4A5009DE740 /* PlateView.swift in Sources */,
7A1022722C554A1300B84627 /* CustomHostingController.swift in Sources */, 7A1022722C554A1300B84627 /* CustomHostingController.swift in Sources */,
7A1022792C557ED600B84627 /* LocationPickerViewModel.swift in Sources */, 7A1022792C557ED600B84627 /* LocationPickerViewModel.swift in Sources */,
7AF231932DA1C28100AE5EB3 /* AuthScreen.swift in Sources */, 7AF231932DA1C28100AE5EB3 /* AuthScreen.swift in Sources */,
@ -1456,7 +1418,6 @@
7A8AB76525A0DB8F00ECF2C1 /* BundleVersion.swift in Sources */, 7A8AB76525A0DB8F00ECF2C1 /* BundleVersion.swift in Sources */,
7A9519822D80B6E500E69883 /* RecordsViewModel.swift in Sources */, 7A9519822D80B6E500E69883 /* RecordsViewModel.swift in Sources */,
7AC355592969746600889457 /* UIControl.swift in Sources */, 7AC355592969746600889457 /* UIControl.swift in Sources */,
7AB67E8E2435D1A000258F61 /* CustomButton.swift in Sources */,
7AC35554296973E100889457 /* ACButton.swift in Sources */, 7AC35554296973E100889457 /* ACButton.swift in Sources */,
7AAAFADC2C4D1E130050410D /* ACImageSliderView+Modifier.swift in Sources */, 7AAAFADC2C4D1E130050410D /* ACImageSliderView+Modifier.swift in Sources */,
7AFBE8C42C302561003C491D /* ACHudContainer.swift in Sources */, 7AFBE8C42C302561003C491D /* ACHudContainer.swift in Sources */,
@ -1476,7 +1437,6 @@
7AB9FE222D08C2A5005DE374 /* EventsScreen.swift in Sources */, 7AB9FE222D08C2A5005DE374 /* EventsScreen.swift in Sources */,
7A5911F02D63266B00EC51BA /* SearchViewModel.swift in Sources */, 7A5911F02D63266B00EC51BA /* SearchViewModel.swift in Sources */,
7A589E0F2D6B6E8E00EF3FBE /* NumberEditView.swift in Sources */, 7A589E0F2D6B6E8E00EF3FBE /* NumberEditView.swift in Sources */,
7ADF6C97250F41B000F237B2 /* PNKeyboard.swift in Sources */,
7A17CE4C2A2E850200626A6E /* UISegmentedControl.swift in Sources */, 7A17CE4C2A2E850200626A6E /* UISegmentedControl.swift in Sources */,
7A9519802D80B6C100E69883 /* RecordsScreen.swift in Sources */, 7A9519802D80B6C100E69883 /* RecordsScreen.swift in Sources */,
7A131FD52D37B76A00DC7755 /* HistoryViewModel.swift in Sources */, 7A131FD52D37B76A00DC7755 /* HistoryViewModel.swift in Sources */,

View File

@ -1,206 +0,0 @@
import UIKit
import AutoCatCore
// MARK: - Types
enum NumberType: Int, CaseIterable {
case plateNumber = 0
case vin = 1
var title: String {
switch self {
case .plateNumber: return "GRZ"
case .vin: return "VIN"
}
}
}
class NewNumberController: UIViewController {
// MARK: - Views
private lazy var keyboardView: PNKeyboard = {
let keyboard = PNKeyboard(target: self.plateView)
keyboard.delegate = self
return keyboard
}()
private lazy var plateView: PlateView = {
let view = PlateView(frame: .zero)
view.fontSize = 48
view.number = PlateNumber("")
view.onChange = onNumberChanged
view.setContentHuggingPriority(.defaultHigh, for: .horizontal)
view.accessibilityIdentifier = "plateView"
return view
}()
private lazy var vinField: UITextField = {
let view = UITextField()
view.translatesAutoresizingMaskIntoConstraints = false
view.borderStyle = .roundedRect
view.isHidden = true
return view
}()
private lazy var checkButton: ACButton = {
let button = ACButton(title: NSLocalizedString("Check", comment: ""), onTap: check)
button.isEnabled = false
button.contentEdgeInsets = .init(top: 0, left: 8, bottom: 0, right: 8)
button.accessibilityIdentifier = "checkButton"
button.setContentHuggingPriority(.defaultHigh, for: .horizontal)
return button
}()
private lazy var stackView: UIStackView = .horizontal([
plateView, vinField, checkButton
])
private let titleLabel: UILabel = {
let label = UILabel()
label.text = NSLocalizedString("Check number", comment: "")
label.font = UIFont.preferredFont(forTextStyle: .headline)
label.textAlignment = .center
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
private lazy var mainStackView: UIStackView = .vertical([
titleLabel,
stackView,
//settingsStackView,
keyboardView
])
private let locationSwitcherView: UISegmentedControl = .segments(images: [
UIImage(systemName: "location.fill"),
UIImage(systemName: "location"),
UIImage(systemName: "location.slash")
])
private lazy var numTypeSwitcherView: UISegmentedControl = .segments(titles: NumberType.allCases.map(\.title))
.select(index: NumberType.plateNumber.rawValue)
.onValueChanged(onNumberTypeChanged)
private lazy var settingsStackView: UIStackView = .horizontal([
numTypeSwitcherView,
locationSwitcherView
])
.distribution(.fillProportionally)
// MARK: - Variables
public var onCheck: ((String) -> Void)?
private var numberType: NumberType = .plateNumber
// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(mainStackView)
mainStackView.pin(to: view, insets: .all(16))
#if targetEnvironment(macCatalyst)
addKeyCommand(UIKeyCommand(input: "v", modifierFlags: .command, action: #selector(pasteText)))
#endif
}
func check() {
guard let number = plateView.number, number.isValid else {
return
}
let numberNormalized = number.asString().filter { !$0.isWhitespace }.uppercased()
onCheck?(numberNormalized)
}
func onNumberChanged() {
checkButton.isEnabled = plateView.number?.isValid ?? false
}
func onNumberTypeChanged(_ index: Int) {
guard let type = NumberType(rawValue: index) else {
return
}
numberType = type
switch type {
case .plateNumber:
plateView.isHidden = false
vinField.isHidden = true
keyboardView.target = plateView
keyboardView.type = .plateNumber
case .vin:
plateView.isHidden = true
vinField.isHidden = false
keyboardView.target = vinField
keyboardView.type = .vin
}
}
}
extension NewNumberController: PNKeyboardDelegate {
func returnClicked() {
check()
}
}
#if targetEnvironment(macCatalyst)
extension NewNumberController {
override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
let ruLetters = Constants.pnLettersMap.keys.map(String.init)
let enLetters = Constants.pnLettersMap.values.map(String.init)
let numbers = Array((0..<10).map(String.init))
var didHandleEvent = true
for press in presses {
guard let key = press.key else {
continue
}
switch key.keyCode {
case .keyboardReturnOrEnter:
check()
case .keyboardEscape:
dismiss(animated: true)
case .keyboardDeleteOrBackspace:
plateView.deleteBackward()
default:
let c = key.charactersIgnoringModifiers.uppercased()
if ruLetters.contains(c) || numbers.contains(c) {
plateView.insertText(c)
} else if enLetters.contains(c) {
if let ruChar = Constants.pnLettersMap.first(where: { $0.value == c.first })?.key {
plateView.insertText(String(ruChar))
}
} else {
didHandleEvent = false
}
}
}
if didHandleEvent == false {
super.pressesBegan(presses, with: event)
}
}
@objc func pasteText() {
guard let text = UIPasteboard.general.string else {
return
}
plateView.setNumber(text)
}
}
#endif

View File

@ -1,14 +1,14 @@
// //
// Environment.swift // PNButtonType.swift
// AutoCat // AutoCat
// //
// Created by Selim Mustafaev on 29.04.2025. // Created by Selim Mustafaev on 29.04.2025.
// Copyright © 2025 Selim Mustafaev. All rights reserved. // Copyright © 2025 Selim Mustafaev. All rights reserved.
// //
import SwiftUI enum PNButtonType {
extension EnvironmentValues { case symbol(Character)
case backspace
@Entry var selectedTab: SideBarItem = .history case done
} }

View File

@ -1,29 +0,0 @@
import UIKit
class BlockBarButtonItem: UIBarButtonItem {
typealias ActionHandler = (UIBarButtonItem) -> Void
private var actionHandler: ActionHandler?
convenience init(image: UIImage?, style: UIBarButtonItem.Style, actionHandler: ActionHandler?) {
self.init(image: image, style: style, target: nil, action: #selector(barButtonItemPressed(sender:)))
target = self
self.actionHandler = actionHandler
}
convenience init(title: String?, style: UIBarButtonItem.Style, actionHandler: ActionHandler?) {
self.init(title: title, style: style, target: nil, action: #selector(barButtonItemPressed(sender:)))
target = self
self.actionHandler = actionHandler
}
convenience init(barButtonSystemItem systemItem: UIBarButtonItem.SystemItem, actionHandler: ActionHandler?) {
self.init(barButtonSystemItem: systemItem, target: nil, action: #selector(barButtonItemPressed(sender:)))
target = self
self.actionHandler = actionHandler
}
@objc func barButtonItemPressed(sender: UIBarButtonItem) {
actionHandler?(sender)
}
}

View File

@ -1,41 +0,0 @@
import UIKit
class CellProgressView: UIView {
let progressLayer = CAShapeLayer()
var progress: Double = 0 {
didSet {
let path = UIBezierPath(rect: self.rect(for: self.progress))
let pathFrom = self.progressLayer.path
self.progressLayer.path = path.cgPath
if self.progress != 0 {
let animation = CABasicAnimation(keyPath: "path")
animation.duration = 0.2
animation.fromValue = pathFrom
animation.toValue = path.cgPath
animation.timingFunction = CAMediaTimingFunction(name: .linear)
self.progressLayer.add(animation, forKey: "pathAnimation")
}
}
}
required init?(coder: NSCoder) {
super.init(coder: coder)
self.progressLayer.frame = self.layer.bounds
self.progressLayer.path = UIBezierPath(rect: self.layer.bounds).cgPath
self.progressLayer.fillColor = UIColor.systemBlue.cgColor
self.progressLayer.opacity = 0.3
self.layer.addSublayer(self.progressLayer)
}
override func layoutSubviews() {
super.layoutSubviews()
self.progressLayer.frame = rect(for: self.progress)
}
func rect(for progress: Double) -> CGRect {
return CGRect(x: 0, y: 0, width: self.bounds.width*CGFloat(progress), height: self.bounds.height)
}
}

View File

@ -1,14 +0,0 @@
import UIKit
class CustomButton: UIButton {
required init?(coder: NSCoder) {
super.init(coder: coder)
self.layer.cornerRadius = 6
}
override func layoutSubviews() {
super.layoutSubviews()
self.layer.opacity = self.isEnabled ? 1 : 0.5
}
}

View File

@ -1,32 +0,0 @@
import UIKit
class CustomTextField: UITextField, UITextFieldDelegate {
@IBInspectable var editable: Bool = true
@IBInspectable var borderWidth: CGFloat = 1 {
didSet {
self.layer.borderWidth = self.borderWidth
}
}
@IBInspectable var cornerRadius: CGFloat = 6 {
didSet {
self.layer.cornerRadius = self.cornerRadius
}
}
required init?(coder: NSCoder) {
super.init(coder: coder)
self.delegate = self
}
override func layoutSubviews() {
super.layoutSubviews()
self.layer.borderColor = UIColor.secondaryLabel.cgColor
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
return self.editable
}
}

View File

@ -1,41 +0,0 @@
import UIKit
class FlagLayer: CALayer {
let pixelWidth: CGFloat
// Flag colors - https://ru.wikipedia.org/wiki/%D0%A4%D0%BB%D0%B0%D0%B3_%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B8
let blue = CGColor(srgbRed: 0, green: 57/256.0, blue: 166/256.0, alpha: 1)
let red = CGColor(srgbRed: 213/256.0, green: 43/256.0, blue: 30/256.0, alpha: 1)
init(scale: CGFloat) {
self.pixelWidth = 1/scale
super.init()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func draw(in ctx: CGContext) {
ctx.saveGState()
super.draw(in: ctx)
ctx.setStrokeColor(UIColor.black.cgColor)
ctx.setLineWidth(0)
ctx.setFillColor(UIColor.white.cgColor)
ctx.fill(bounds.inset(by: UIEdgeInsets(top: 0, left: 0, bottom: bounds.height*2/3, right: 0)))
ctx.setFillColor(self.blue)
ctx.fill(bounds.insetBy(dx: 0, dy: bounds.height/3))
ctx.setFillColor(self.red)
ctx.fill(bounds.inset(by: UIEdgeInsets(top: bounds.height*2/3, left: 0, bottom: 0, right: 0)))
ctx.setLineWidth(pixelWidth)
ctx.stroke(bounds.insetBy(dx: pixelWidth/2, dy: pixelWidth/2))
ctx.restoreGState()
}
}

View File

@ -1,300 +0,0 @@
import UIKit
import AutoCatCore
@MainActor
protocol PNKeyboardDelegate: AnyObject {
func returnClicked()
}
@MainActor
protocol PNButtonDelegate: AnyObject {
func buttonTapped(_ button: PNButton)
}
enum PNButtonType {
case symbol(Character)
case backspace
case done
}
enum PNKeyboardType {
case plateNumber
case vin
}
class PNButton: UIButton {
private(set) var type: PNButtonType
private var keyboardType: PNKeyboardType = .plateNumber
private var rectLayer = CAShapeLayer()
private var bgColor = UIColor(named: "KeyBackground")
weak var delegate: PNButtonDelegate?
var letterFont: UIFont? {
switch keyboardType {
case .plateNumber:
return UIFont(name: "RoadNumbers", size: 36)
case .vin:
return .systemFont(ofSize: 24)
}
}
var digitFont: UIFont? {
switch keyboardType {
case .plateNumber:
return UIFont(name: "RoadNumbersCyr-Regular", size: 30)
case .vin:
return .systemFont(ofSize: 24)
}
}
init(letter: Character, keyboardType: PNKeyboardType = .plateNumber) {
self.type = .symbol(letter)
self.keyboardType = keyboardType
super.init(frame: .zero)
self.setup()
self.titleLabel?.font = letterFont
let title = String(Constants.pnLettersMap[letter] ?? letter)
self.setTitle(title, for: .normal)
self.setTitleColor(.label, for: .normal)
}
init(digit: Int, keyboardType: PNKeyboardType = .plateNumber) {
self.type = .symbol(String(digit).first!)
self.keyboardType = keyboardType
super.init(frame: .zero)
self.setup()
self.titleLabel?.font = digitFont
let character = Character(String(digit))
let title = String(Constants.pnLettersMap[character] ?? character)
self.setTitle(title, for: .normal)
self.setTitleColor(.label, for: .normal)
}
init(imageName: String, type: PNButtonType) {
self.type = type
self.bgColor = UIColor(named: "DarkKeyBackground")
super.init(frame: .zero)
self.setup()
self.setImage(UIImage(systemName: imageName), for: .normal)
self.tintColor = .label
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setup(_ radius: CGFloat = 0.5) {
self.rectLayer.cornerRadius = 6
self.layer.addSublayer(self.rectLayer)
self.imageView?.layer.zPosition = 2
self.contentEdgeInsets = .vertical(12)
self.rectLayer.shadowColor = UIColor.black.cgColor
self.rectLayer.shadowOpacity = 0.4
self.rectLayer.shadowOffset = CGSize(width: 0.0, height : 1.0)
self.rectLayer.shadowRadius = radius
self.addTarget(self, action: #selector(buttonDown), for: .touchDown)
self.addTarget(self, action: #selector(buttonUp), for: [.touchUpInside, .touchUpOutside, .touchCancel])
self.addTarget(self, action: #selector(touchUpInside), for: .touchUpInside)
}
override func layoutSubviews() {
super.layoutSubviews()
self.rectLayer.backgroundColor = self.bgColor?.cgColor
self.rectLayer.frame = self.layer.bounds.inset(by: UIEdgeInsets(top: 4, left: 4, bottom: 4, right: 4))
}
@objc func buttonDown(_ sender: PNButton) {
sender.layer.opacity = 0.3
}
@objc func buttonUp(_ sender: PNButton) {
sender.layer.opacity = 1
}
@objc func touchUpInside(_ sender: PNButton) {
self.delegate?.buttonTapped(self)
}
func setBacgroundColor(color: UIColor) {
self.bgColor = color
self.setNeedsLayout()
}
}
class PNKeyboard: UIView, UIInputViewAudioFeedback, PNButtonDelegate {
public weak var target: UIKeyInput?
weak var delegate: PNKeyboardDelegate?
private let insets: UIEdgeInsets
public var type: PNKeyboardType {
didSet {
setupButtons()
}
}
var letters: [Character] {
switch type {
case .plateNumber:
return Array(Constants.pnLettersMap.keys)
case .vin:
return Constants.vinLetters
}
}
private var lettersWidthConstraint: NSLayoutConstraint?
private var digitsWidthConstraint: NSLayoutConstraint?
var mainStack: UIStackView = .horizontal([])
//.distribution(.fillProportionally)
.spacing(16)
init(target: UIKeyInput, type: PNKeyboardType = .plateNumber, insets: UIEdgeInsets = .zero) {
self.target = target
self.insets = insets
self.type = type
super.init(frame: .zero)
self.autoresizingMask = [.flexibleWidth, .flexibleHeight]
let blurEffectView = UIVisualEffectView(effect: UIBlurEffect())
blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
self.addSubview(blurEffectView)
self.addSubview(mainStack)
NSLayoutConstraint.activate([
mainStack.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: insets.left),
mainStack.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -insets.right),
mainStack.topAnchor.constraint(equalTo: self.topAnchor, constant: insets.top),
mainStack.bottomAnchor.constraint(equalTo: self.safeAreaLayoutGuide.bottomAnchor, constant: -insets.bottom)
])
self.setupButtons()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
super.layoutSubviews()
let lettersMult: CGFloat = type == .plateNumber ? 0.5 : 2.0/3.0
let digitsMult: CGFloat = type == .plateNumber ? 0.5 : 1.0/3.0
let availableWidth = frame.width - mainStack.spacing
let newLettersWidth = availableWidth*lettersMult
let newDigitsWidth = availableWidth*digitsMult
let needChangeConstraints = lettersWidthConstraint?.constant != newLettersWidth
|| digitsWidthConstraint?.constant != newDigitsWidth
if needChangeConstraints {
lettersWidthConstraint?.constant = newLettersWidth
digitsWidthConstraint?.constant = newDigitsWidth
}
}
func letterRows(from buttons: [PNButton]) -> [UIView] {
switch type {
case .plateNumber:
return [
createLetterStack([buttons[0], buttons[1], buttons[2]]),
createLetterStack([buttons[3], buttons[4], buttons[5]]),
createLetterStack([buttons[6], buttons[7], buttons[8]]),
createLetterStack([buttons[9], buttons[10], buttons[11]])
]
case .vin:
return [
createLetterStack([buttons[0], buttons[1], buttons[2], buttons[3], buttons[4], buttons[5]]),
createLetterStack([buttons[6], buttons[7], buttons[8], buttons[9], buttons[10], buttons[11]]),
createLetterStack([buttons[12], buttons[13], buttons[14], buttons[15], buttons[16], buttons[17]]),
createLetterStack([buttons[18], buttons[19], buttons[20], buttons[21], buttons[22]])
]
}
}
func setupButtons() {
let letterButtons: [PNButton] = letters.sorted().map { letter in
let button = PNButton(letter: letter, keyboardType: type)
button.delegate = self
return button
}
let digits: [PNButton] = [1,2,3,4,5,6,7,8,9,0].map { digit in
let button = PNButton(digit: digit, keyboardType: type)
button.delegate = self
return button
}
let backspace = PNButton(imageName: "delete.left", type: .backspace)
backspace.delegate = self
let done = PNButton(imageName: "arrow.turn.down.left", type: .done)
done.delegate = self
done.setBacgroundColor(color: .systemBlue)
done.tintColor = .white
let rows = letterRows(from: letterButtons)
let lettersStack = UIStackView(arrangedSubviews: rows)
lettersStack.axis = .vertical
lettersStack.distribution = .fillEqually
//lettersStack.spacing = 8
let digitRows = [
self.createLetterStack([digits[0], digits[1], digits[2]]),
self.createLetterStack([digits[3], digits[4], digits[5]]),
self.createLetterStack([digits[6], digits[7], digits[8]]),
self.createLetterStack([digits[9], backspace, done])
]
let digitsStack = UIStackView(arrangedSubviews: digitRows)
digitsStack.axis = .vertical
digitsStack.distribution = .fillEqually
//digitsStack.spacing = 8
mainStack.setArrangedSubviews([lettersStack, digitsStack])
lettersWidthConstraint = lettersStack.widthAnchor.constraint(equalToConstant: 0)
digitsWidthConstraint = digitsStack.widthAnchor.constraint(equalToConstant: 0)
lettersWidthConstraint?.priority = .defaultLow
digitsWidthConstraint?.priority = .defaultLow
NSLayoutConstraint.activate([lettersWidthConstraint, digitsWidthConstraint].compactMap { $0 })
}
func createLetterStack(_ views: [UIView]) -> UIStackView {
let stack = UIStackView(arrangedSubviews: views)
stack.distribution = .fillEqually
//stack.spacing = 8
return stack
}
// MARK: - PNButtonDelegate
func buttonTapped(_ button: PNButton) {
UIDevice.current.playInputClick()
switch button.type {
case .symbol(let s):
self.target?.insertText(String(s))
case .backspace:
self.target?.deleteBackward()
case .done:
self.delegate?.returnClicked()
}
}
// MARK: - UIInputViewAudioFeedback
var enableInputClicksWhenVisible: Bool {
return true
}
}

View File

@ -1,191 +0,0 @@
import UIKit
import AutoCatCore
private class CALayerAnimationsDisablingDelegate: NSObject, CALayerDelegate {
@MainActor static let shared = CALayerAnimationsDisablingDelegate()
private let null = NSNull()
func action(for layer: CALayer, forKey event: String) -> CAAction? {
null
}
}
class PlateView: UIView {
// Some driver plate parameters from "ГОСТ Р 50577-93"
// http://docs.cntd.ru/document/gost-r-50577-93
private static let aspectRatio: CGFloat = 112.0/520.0
private static let fontHeightCoeff: CGFloat = 58.0/76.0
private var bgLayer = CALayer()
private var mainBgLayer = CALayer()
private var regionBgLayer = CALayer()
private var numberLayer = CenterTextLayer(coeff: fontHeightCoeff)
private var regionLayer = CenterTextLayer(coeff: fontHeightCoeff)
private var countryLayer = CenterTextLayer()
private var flagLayer = FlagLayer(scale: UIScreen.main.scale)
var number: PlateNumber? {
didSet {
self.layoutSubviews()
}
}
var foreground: UIColor? {
didSet {
self.layoutSubviews()
}
}
var fontSize: CGFloat = 10 {
didSet {
self.layoutSubviews()
}
}
var onChange: (@MainActor () -> Void)?
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
setup()
}
func setup() {
self.layer.backgroundColor = UIColor.clear.cgColor
self.bgLayer.cornerRadius = 6 //self.bounds.height/8
self.layer.addSublayer(self.bgLayer)
self.mainBgLayer.cornerRadius = 4
self.layer.addSublayer(self.mainBgLayer)
self.regionBgLayer.cornerRadius = 4
self.layer.addSublayer(self.regionBgLayer)
self.numberLayer.alignmentMode = .center
self.numberLayer.contentsScale = UIScreen.main.scale
self.layer.addSublayer(self.numberLayer)
self.regionLayer.alignmentMode = .center
self.regionLayer.contentsScale = UIScreen.main.scale
self.layer.addSublayer(self.regionLayer)
self.countryLayer.contentsScale = UIScreen.main.scale
self.countryLayer.string = "RUS"
self.countryLayer.alignmentMode = .center
self.layer.addSublayer(self.countryLayer)
self.flagLayer.contentsScale = UIScreen.main.scale
self.layer.addSublayer(self.flagLayer)
disableAnimations(for: [
bgLayer,
mainBgLayer,
regionBgLayer,
numberLayer,
regionLayer,
countryLayer,
flagLayer
])
}
func disableAnimations(for layers: [CALayer]) {
layers.forEach { $0.delegate = CALayerAnimationsDisablingDelegate.shared }
}
private func pathForFlag(in rect: CGRect) -> CGPath {
let path = CGMutablePath()
let rect = CGPath(rect: rect, transform: nil)
path.addPath(rect)
return path
}
override func layoutSubviews() {
super.layoutSubviews()
guard let number = self.number else { return }
guard let fgColorMain = UIColor(named: "PlateForeground")?.cgColor else { return }
guard let bgColor = UIColor(named: "PlateBackground")?.cgColor else { return }
let fgColor = self.foreground?.cgColor ?? fgColorMain
self.bgLayer.backgroundColor = fgColor
self.bgLayer.frame = self.bounds
self.mainBgLayer.backgroundColor = bgColor
self.regionBgLayer.backgroundColor = bgColor
self.mainBgLayer.frame = self.bounds.inset(by: UIEdgeInsets(top: 2, left: 2, bottom: 2, right: self.bounds.width*0.27 + 1))
self.regionBgLayer.frame = self.bounds.inset(by: UIEdgeInsets(top: 2, left: self.bounds.width*0.73 + 1, bottom: 2, right: 2))
self.numberLayer.frame = self.mainBgLayer.frame.insetBy(dx: 4, dy: 0)
let font = UIFont(name: "RoadNumbers", size: self.mainBgLayer.frame.height*1.1) ?? UIFont.boldSystemFont(ofSize: 24)
let attributes: [NSAttributedString.Key: Any] = [
.kern: 3,
.font: font,
.foregroundColor: fgColor
]
let attributed = NSAttributedString(string: number.mainPart(), attributes: attributes)
self.numberLayer.string = attributed
let rbgSize = self.regionBgLayer.frame.size
self.regionLayer.frame = self.regionBgLayer.frame.inset(by: UIEdgeInsets(top: 2, left: 2, bottom: rbgSize.height*0.35, right: 2))
let regionFont = UIFont(name: "RoadNumbers", size: rbgSize.height*0.8) ?? UIFont.boldSystemFont(ofSize: 24)
let regionAttrs: [NSAttributedString.Key: Any] = [
.kern: 1,
.font: regionFont,
.foregroundColor: fgColor
]
let attributedRegion = NSAttributedString(string: number.region(), attributes: regionAttrs)
self.regionLayer.string = attributedRegion
self.countryLayer.foregroundColor = fgColor
self.countryLayer.frame = self.regionBgLayer.frame.inset(by: UIEdgeInsets(top: rbgSize.height*0.64, left: rbgSize.width*0.08, bottom: rbgSize.height*0.07, right: rbgSize.width*0.42))
self.countryLayer.fontSize = self.countryLayer.frame.size.height
let top = (self.regionBgLayer.frame.origin.y + rbgSize.height*0.68).rounded(.toNearestOrAwayFromZero)
let left = (self.regionBgLayer.frame.origin.x + rbgSize.width*0.62).rounded(.toNearestOrAwayFromZero)
let w = (rbgSize.width*0.34).rounded(.toNearestOrAwayFromZero)
let h = (rbgSize.height*0.28).rounded(.toNearestOrAwayFromZero)
self.flagLayer.frame = CGRect(x: left, y: top, width: w, height: h)
self.flagLayer.setNeedsDisplay()
}
override var intrinsicContentSize: CGSize {
let height = fontSize/1.1 + 4
let width = height/PlateView.aspectRatio
print("")
return CGSize(width: width, height: height)
}
func setNumber(_ number: String) {
self.number?.setNumber(number)
layoutSubviews()
onChange?()
}
}
extension PlateView: UIKeyInput {
var hasText: Bool {
number?.hasText ?? false
}
func insertText(_ text: String) {
if number?.insertText(text) == true {
layoutSubviews()
onChange?()
}
}
func deleteBackward() {
if number?.deleteBackward() == true {
layoutSubviews()
onChange?()
}
}
}