Removing old UIKit code
This commit is contained in:
parent
72ce7ec798
commit
e3ed146f5c
@ -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 */,
|
||||||
|
|||||||
@ -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
|
|
||||||
@ -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 {
|
|
||||||
|
|
||||||
@Entry var selectedTab: SideBarItem = .history
|
case symbol(Character)
|
||||||
|
case backspace
|
||||||
|
case done
|
||||||
}
|
}
|
||||||
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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?()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue
Block a user