Merge branch 'develop' of https://gitlab.verizon.com/BPHV_MIPS/mvm_core_ui into feature/mva_3_0
This commit is contained in:
commit
03ee7b99c2
@ -3,7 +3,7 @@
|
|||||||
archiveVersion = 1;
|
archiveVersion = 1;
|
||||||
classes = {
|
classes = {
|
||||||
};
|
};
|
||||||
objectVersion = 50;
|
objectVersion = 48;
|
||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
@ -18,6 +18,10 @@
|
|||||||
01DF567021FA5AB300CC099B /* TextFieldListFormViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01DF566F21FA5AB300CC099B /* TextFieldListFormViewController.swift */; };
|
01DF567021FA5AB300CC099B /* TextFieldListFormViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01DF566F21FA5AB300CC099B /* TextFieldListFormViewController.swift */; };
|
||||||
01E569D3223FFFA500327251 /* ThreeLayerViewController.swift in Headers */ = {isa = PBXBuildFile; fileRef = D2A5146A2214905000345BFB /* ThreeLayerViewController.swift */; settings = {ATTRIBUTES = (Public, ); }; };
|
01E569D3223FFFA500327251 /* ThreeLayerViewController.swift in Headers */ = {isa = PBXBuildFile; fileRef = D2A5146A2214905000345BFB /* ThreeLayerViewController.swift */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */; };
|
0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */; };
|
||||||
|
0A1B4A96233BB18F005B3FB4 /* CheckboxWithLabelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAFA2232BE63400FB8E22 /* CheckboxWithLabelView.swift */; };
|
||||||
|
0A41BA6E2344FCD400D4C0BC /* CATransaction+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */; };
|
||||||
|
0A7BAFA1232BE61800FB8E22 /* Checkbox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAFA0232BE61800FB8E22 /* Checkbox.swift */; };
|
||||||
|
9455B19C234F8A0400A574DB /* MVMAnimationFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */; };
|
||||||
948DB67E2326DCD90011F916 /* MultiProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 948DB67D2326DCD90011F916 /* MultiProgress.swift */; };
|
948DB67E2326DCD90011F916 /* MultiProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 948DB67D2326DCD90011F916 /* MultiProgress.swift */; };
|
||||||
B8200E152280C4CF007245F4 /* ProgressBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8200E142280C4CF007245F4 /* ProgressBar.swift */; };
|
B8200E152280C4CF007245F4 /* ProgressBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8200E142280C4CF007245F4 /* ProgressBar.swift */; };
|
||||||
B8200E192281DC1A007245F4 /* CornerLabels.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8200E182281DC1A007245F4 /* CornerLabels.swift */; };
|
B8200E192281DC1A007245F4 /* CornerLabels.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8200E182281DC1A007245F4 /* CornerLabels.swift */; };
|
||||||
@ -150,7 +154,6 @@
|
|||||||
D29DF2CB21E7BFCC003B2FB9 /* MFSizeThreshold.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF14721E68728003B2FB9 /* MFSizeThreshold.m */; };
|
D29DF2CB21E7BFCC003B2FB9 /* MFSizeThreshold.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF14721E68728003B2FB9 /* MFSizeThreshold.m */; };
|
||||||
D29DF2CE21E7C104003B2FB9 /* MFLoadingViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2CC21E7C104003B2FB9 /* MFLoadingViewController.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
D29DF2CE21E7C104003B2FB9 /* MFLoadingViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2CC21E7C104003B2FB9 /* MFLoadingViewController.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
D29DF2CF21E7C104003B2FB9 /* MFLoadingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2CD21E7C104003B2FB9 /* MFLoadingViewController.m */; };
|
D29DF2CF21E7C104003B2FB9 /* MFLoadingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF2CD21E7C104003B2FB9 /* MFLoadingViewController.m */; };
|
||||||
D29DF2D121E7C1C8003B2FB9 /* MVMAnimationFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D29DF2D021E7C1C8003B2FB9 /* MVMAnimationFramework.framework */; };
|
|
||||||
D29DF2E121E9240B003B2FB9 /* MVMCoreUIPanelProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2E021E9240B003B2FB9 /* MVMCoreUIPanelProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
D29DF2E121E9240B003B2FB9 /* MVMCoreUIPanelProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF2E021E9240B003B2FB9 /* MVMCoreUIPanelProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
D29DF2EE21ECEADF003B2FB9 /* MFFonts.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF14D21E693AD003B2FB9 /* MFFonts.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
D29DF2EE21ECEADF003B2FB9 /* MFFonts.h in Headers */ = {isa = PBXBuildFile; fileRef = D29DF14D21E693AD003B2FB9 /* MFFonts.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
D29DF2EF21ECEAE1003B2FB9 /* MFFonts.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF14C21E693AD003B2FB9 /* MFFonts.m */; };
|
D29DF2EF21ECEAE1003B2FB9 /* MFFonts.m in Sources */ = {isa = PBXBuildFile; fileRef = D29DF14C21E693AD003B2FB9 /* MFFonts.m */; };
|
||||||
@ -203,6 +206,10 @@
|
|||||||
01DF55DF21F8FAA800CC099B /* MFTextFieldListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MFTextFieldListView.swift; sourceTree = "<group>"; };
|
01DF55DF21F8FAA800CC099B /* MFTextFieldListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MFTextFieldListView.swift; sourceTree = "<group>"; };
|
||||||
01DF566F21FA5AB300CC099B /* TextFieldListFormViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextFieldListFormViewController.swift; sourceTree = "<group>"; };
|
01DF566F21FA5AB300CC099B /* TextFieldListFormViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextFieldListFormViewController.swift; sourceTree = "<group>"; };
|
||||||
0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionDetailWithImage.swift; sourceTree = "<group>"; };
|
0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionDetailWithImage.swift; sourceTree = "<group>"; };
|
||||||
|
0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CATransaction+Extension.swift"; sourceTree = "<group>"; };
|
||||||
|
0A7BAFA0232BE61800FB8E22 /* Checkbox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Checkbox.swift; sourceTree = "<group>"; };
|
||||||
|
0A7BAFA2232BE63400FB8E22 /* CheckboxWithLabelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckboxWithLabelView.swift; sourceTree = "<group>"; };
|
||||||
|
9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MVMAnimationFramework.framework; path = ../SharedFrameworks/MVMAnimationFramework.framework; sourceTree = "<group>"; };
|
||||||
948DB67D2326DCD90011F916 /* MultiProgress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiProgress.swift; sourceTree = "<group>"; };
|
948DB67D2326DCD90011F916 /* MultiProgress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiProgress.swift; sourceTree = "<group>"; };
|
||||||
B8200E142280C4CF007245F4 /* ProgressBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressBar.swift; sourceTree = "<group>"; };
|
B8200E142280C4CF007245F4 /* ProgressBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressBar.swift; sourceTree = "<group>"; };
|
||||||
B8200E182281DC1A007245F4 /* CornerLabels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CornerLabels.swift; sourceTree = "<group>"; };
|
B8200E182281DC1A007245F4 /* CornerLabels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CornerLabels.swift; sourceTree = "<group>"; };
|
||||||
@ -339,7 +346,6 @@
|
|||||||
D29DF2C321E7BF57003B2FB9 /* MFTabBarInteractor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFTabBarInteractor.m; sourceTree = "<group>"; };
|
D29DF2C321E7BF57003B2FB9 /* MFTabBarInteractor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFTabBarInteractor.m; sourceTree = "<group>"; };
|
||||||
D29DF2CC21E7C104003B2FB9 /* MFLoadingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFLoadingViewController.h; sourceTree = "<group>"; };
|
D29DF2CC21E7C104003B2FB9 /* MFLoadingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFLoadingViewController.h; sourceTree = "<group>"; };
|
||||||
D29DF2CD21E7C104003B2FB9 /* MFLoadingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFLoadingViewController.m; sourceTree = "<group>"; };
|
D29DF2CD21E7C104003B2FB9 /* MFLoadingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFLoadingViewController.m; sourceTree = "<group>"; };
|
||||||
D29DF2D021E7C1C8003B2FB9 /* MVMAnimationFramework.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MVMAnimationFramework.framework; path = ../SharedFrameworks/MVMAnimationFramework.framework; sourceTree = "<group>"; };
|
|
||||||
D29DF2E021E9240B003B2FB9 /* MVMCoreUIPanelProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIPanelProtocol.h; sourceTree = "<group>"; };
|
D29DF2E021E9240B003B2FB9 /* MVMCoreUIPanelProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIPanelProtocol.h; sourceTree = "<group>"; };
|
||||||
D29DF31621ECECC0003B2FB9 /* NHaasGroteskDSStd-45Lt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NHaasGroteskDSStd-45Lt.otf"; sourceTree = "<group>"; };
|
D29DF31621ECECC0003B2FB9 /* NHaasGroteskDSStd-45Lt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NHaasGroteskDSStd-45Lt.otf"; sourceTree = "<group>"; };
|
||||||
D29DF31721ECECC0003B2FB9 /* OCRAExtended.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = OCRAExtended.ttf; sourceTree = "<group>"; };
|
D29DF31721ECECC0003B2FB9 /* OCRAExtended.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = OCRAExtended.ttf; sourceTree = "<group>"; };
|
||||||
@ -387,7 +393,7 @@
|
|||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
D29DF0E621E4F3C7003B2FB9 /* MVMCore.framework in Frameworks */,
|
D29DF0E621E4F3C7003B2FB9 /* MVMCore.framework in Frameworks */,
|
||||||
D29DF2D121E7C1C8003B2FB9 /* MVMAnimationFramework.framework in Frameworks */,
|
9455B19C234F8A0400A574DB /* MVMAnimationFramework.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@ -532,8 +538,8 @@
|
|||||||
D29DF0E421E4F3C7003B2FB9 /* Frameworks */ = {
|
D29DF0E421E4F3C7003B2FB9 /* Frameworks */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
D29DF2D021E7C1C8003B2FB9 /* MVMAnimationFramework.framework */,
|
|
||||||
D29DF0E521E4F3C7003B2FB9 /* MVMCore.framework */,
|
D29DF0E521E4F3C7003B2FB9 /* MVMCore.framework */,
|
||||||
|
9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */,
|
||||||
);
|
);
|
||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -650,6 +656,7 @@
|
|||||||
D29DF2A021E7AF4E003B2FB9 /* MVMCoreUIUtility.m */,
|
D29DF2A021E7AF4E003B2FB9 /* MVMCoreUIUtility.m */,
|
||||||
D29DF2A721E7B2F9003B2FB9 /* MVMCoreUIConstants.h */,
|
D29DF2A721E7B2F9003B2FB9 /* MVMCoreUIConstants.h */,
|
||||||
D29DF2A821E7B2F9003B2FB9 /* MVMCoreUIConstants.m */,
|
D29DF2A821E7B2F9003B2FB9 /* MVMCoreUIConstants.m */,
|
||||||
|
0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */,
|
||||||
);
|
);
|
||||||
path = Utility;
|
path = Utility;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -722,6 +729,8 @@
|
|||||||
DB891E822253FA8500022516 /* Label.swift */,
|
DB891E822253FA8500022516 /* Label.swift */,
|
||||||
0198F7A02256A80A0066C936 /* MFRadioButton.h */,
|
0198F7A02256A80A0066C936 /* MFRadioButton.h */,
|
||||||
0198F7A22256A80A0066C936 /* MFRadioButton.m */,
|
0198F7A22256A80A0066C936 /* MFRadioButton.m */,
|
||||||
|
0A7BAFA0232BE61800FB8E22 /* Checkbox.swift */,
|
||||||
|
0A7BAFA2232BE63400FB8E22 /* CheckboxWithLabelView.swift */,
|
||||||
);
|
);
|
||||||
path = Views;
|
path = Views;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -953,11 +962,12 @@
|
|||||||
D29DF0CB21E404D4003B2FB9 = {
|
D29DF0CB21E404D4003B2FB9 = {
|
||||||
CreatedOnToolsVersion = 10.1;
|
CreatedOnToolsVersion = 10.1;
|
||||||
LastSwiftMigration = 1010;
|
LastSwiftMigration = 1010;
|
||||||
|
ProvisioningStyle = Automatic;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
buildConfigurationList = D29DF0C621E404D4003B2FB9 /* Build configuration list for PBXProject "MVMCoreUI" */;
|
buildConfigurationList = D29DF0C621E404D4003B2FB9 /* Build configuration list for PBXProject "MVMCoreUI" */;
|
||||||
compatibilityVersion = "Xcode 9.3";
|
compatibilityVersion = "Xcode 8.0";
|
||||||
developmentRegion = en;
|
developmentRegion = en;
|
||||||
hasScannedForEncodings = 0;
|
hasScannedForEncodings = 0;
|
||||||
knownRegions = (
|
knownRegions = (
|
||||||
@ -1036,6 +1046,7 @@
|
|||||||
D2D6CD4022E78C1A00D701B8 /* Scroller.swift in Sources */,
|
D2D6CD4022E78C1A00D701B8 /* Scroller.swift in Sources */,
|
||||||
D29DF13021E6851E003B2FB9 /* MVMCoreUITopAlertShortView.m in Sources */,
|
D29DF13021E6851E003B2FB9 /* MVMCoreUITopAlertShortView.m in Sources */,
|
||||||
D28B4F8B21FF967C00712C7A /* MVMCoreUIObject.m in Sources */,
|
D28B4F8B21FF967C00712C7A /* MVMCoreUIObject.m in Sources */,
|
||||||
|
0A1B4A96233BB18F005B3FB4 /* CheckboxWithLabelView.swift in Sources */,
|
||||||
D260D7B222D65BDD007E7233 /* MVMCoreUIPageControl.m in Sources */,
|
D260D7B222D65BDD007E7233 /* MVMCoreUIPageControl.m in Sources */,
|
||||||
D29DF26D21E6AA0B003B2FB9 /* FLAnimatedImageView.m in Sources */,
|
D29DF26D21E6AA0B003B2FB9 /* FLAnimatedImageView.m in Sources */,
|
||||||
D29DF2EF21ECEAE1003B2FB9 /* MFFonts.m in Sources */,
|
D29DF2EF21ECEAE1003B2FB9 /* MFFonts.m in Sources */,
|
||||||
@ -1043,6 +1054,7 @@
|
|||||||
D282AACB2243C61700C46919 /* ButtonView.swift in Sources */,
|
D282AACB2243C61700C46919 /* ButtonView.swift in Sources */,
|
||||||
D2D6CD4222E78FAB00D701B8 /* ThreeLayerTemplate.swift in Sources */,
|
D2D6CD4222E78FAB00D701B8 /* ThreeLayerTemplate.swift in Sources */,
|
||||||
0105618F224BBE7700E1557D /* FormValidator+FormParams.swift in Sources */,
|
0105618F224BBE7700E1557D /* FormValidator+FormParams.swift in Sources */,
|
||||||
|
0A7BAFA1232BE61800FB8E22 /* Checkbox.swift in Sources */,
|
||||||
D22479962316AF6E003FCCF9 /* HeadlineBodyTextButton.swift in Sources */,
|
D22479962316AF6E003FCCF9 /* HeadlineBodyTextButton.swift in Sources */,
|
||||||
D2E1FADD2268B25E00AEFD8C /* MoleculeTableViewCell.swift in Sources */,
|
D2E1FADD2268B25E00AEFD8C /* MoleculeTableViewCell.swift in Sources */,
|
||||||
D29DF2AE21E7B3A4003B2FB9 /* MFTextView.m in Sources */,
|
D29DF2AE21E7B3A4003B2FB9 /* MFTextView.m in Sources */,
|
||||||
@ -1087,6 +1099,7 @@
|
|||||||
D29DF25121E6A177003B2FB9 /* MFDigitTextBox.m in Sources */,
|
D29DF25121E6A177003B2FB9 /* MFDigitTextBox.m in Sources */,
|
||||||
DBC4391B224421A0001AB423 /* CaretButton.swift in Sources */,
|
DBC4391B224421A0001AB423 /* CaretButton.swift in Sources */,
|
||||||
0198F7A82256A80B0066C936 /* MFRadioButton.m in Sources */,
|
0198F7A82256A80B0066C936 /* MFRadioButton.m in Sources */,
|
||||||
|
0A41BA6E2344FCD400D4C0BC /* CATransaction+Extension.swift in Sources */,
|
||||||
D29DF13221E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.m in Sources */,
|
D29DF13221E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.m in Sources */,
|
||||||
D29DF29C21E7ADB9003B2FB9 /* MFProgrammaticTableViewController.m in Sources */,
|
D29DF29C21E7ADB9003B2FB9 /* MFProgrammaticTableViewController.m in Sources */,
|
||||||
0105618E224BBE7700E1557D /* FormValidator+TextFields.swift in Sources */,
|
0105618E224BBE7700E1557D /* FormValidator+TextFields.swift in Sources */,
|
||||||
@ -1173,7 +1186,7 @@
|
|||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 12.1;
|
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
@ -1232,12 +1245,11 @@
|
|||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 12.1;
|
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
SWIFT_COMPILATION_MODE = wholemodule;
|
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
|
||||||
VALIDATE_PRODUCT = YES;
|
VALIDATE_PRODUCT = YES;
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
VERSION_INFO_PREFIX = "";
|
VERSION_INFO_PREFIX = "";
|
||||||
@ -1259,12 +1271,8 @@
|
|||||||
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../SharedFrameworks";
|
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../SharedFrameworks";
|
||||||
INFOPLIST_FILE = MVMCoreUI/Info.plist;
|
INFOPLIST_FILE = MVMCoreUI/Info.plist;
|
||||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/Frameworks",
|
|
||||||
"@loader_path/Frameworks",
|
|
||||||
);
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.vzw.MVMCoreUI;
|
PRODUCT_BUNDLE_IDENTIFIER = com.vzw.MVMCoreUI;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
@ -1289,12 +1297,8 @@
|
|||||||
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../SharedFrameworks";
|
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../SharedFrameworks";
|
||||||
INFOPLIST_FILE = MVMCoreUI/Info.plist;
|
INFOPLIST_FILE = MVMCoreUI/Info.plist;
|
||||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/Frameworks",
|
|
||||||
"@loader_path/Frameworks",
|
|
||||||
);
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.vzw.MVMCoreUI;
|
PRODUCT_BUNDLE_IDENTIFIER = com.vzw.MVMCoreUI;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
|
|||||||
@ -83,11 +83,9 @@
|
|||||||
self.enabled = YES;
|
self.enabled = YES;
|
||||||
|
|
||||||
// Disable SmartQuotes
|
// Disable SmartQuotes
|
||||||
if (@available(iOS 11.0, *)) {
|
self.textField.smartQuotesType = UITextSmartQuotesTypeNo;
|
||||||
self.textField.smartQuotesType = UITextSmartQuotesTypeNo;
|
self.textField.smartDashesType = UITextSmartDashesTypeNo;
|
||||||
self.textField.smartDashesType = UITextSmartDashesTypeNo;
|
self.textField.smartInsertDeleteType = UITextSmartInsertDeleteTypeNo;
|
||||||
self.textField.smartInsertDeleteType = UITextSmartInsertDeleteTypeNo;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
478
MVMCoreUI/Atoms/Views/Checkbox.swift
Normal file
478
MVMCoreUI/Atoms/Views/Checkbox.swift
Normal file
@ -0,0 +1,478 @@
|
|||||||
|
//
|
||||||
|
// Checkbox.swift
|
||||||
|
// MVMCoreUI
|
||||||
|
//
|
||||||
|
// Created by Kevin Christiano on 9/13/19.
|
||||||
|
// Copyright © 2019 Verizon Wireless. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import MVMCore
|
||||||
|
|
||||||
|
/**
|
||||||
|
This class expects its height and width to be equal.
|
||||||
|
*/
|
||||||
|
@objcMembers open class Checkbox: UIControl, MVMCoreViewProtocol, MVMCoreUIMoleculeViewProtocol, MVMCoreUIViewConstrainingProtocol {
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Properties
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
// Form Validation
|
||||||
|
var isRequired = false
|
||||||
|
var fieldKey: String?
|
||||||
|
var delegateObject: DelegateObject?
|
||||||
|
|
||||||
|
public static let defaultHeightWidth: CGFloat = 18.0
|
||||||
|
|
||||||
|
/// If true the border of this checkbox will be circular.
|
||||||
|
public var isRound: Bool = false
|
||||||
|
|
||||||
|
/// Determined if the checkbox's UI should animated when selected.
|
||||||
|
public var isAnimated: Bool = true
|
||||||
|
|
||||||
|
/// Disables all selection logic when setting the value of isSelected, reducing it to a stored property.
|
||||||
|
public var updateSelectionOnly: Bool = false
|
||||||
|
|
||||||
|
/// The color of the background when checked.
|
||||||
|
public var checkedBackgroundColor: UIColor = .clear {
|
||||||
|
didSet {
|
||||||
|
if isSelected {
|
||||||
|
backgroundColor = checkedBackgroundColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The color of the background when unChecked.
|
||||||
|
public var unCheckedBackgroundColor: UIColor = .clear {
|
||||||
|
didSet {
|
||||||
|
if !isSelected {
|
||||||
|
backgroundColor = unCheckedBackgroundColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Retrieves ideeal radius value to curve square into a circle.
|
||||||
|
public var cornerRadiusValue: CGFloat {
|
||||||
|
return bounds.size.height / 2
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Action Block called when the switch is selected.
|
||||||
|
public var actionBlock: ActionBlock?
|
||||||
|
|
||||||
|
/// Manages the appearance of the checkbox.
|
||||||
|
private var shapeLayer: CAShapeLayer?
|
||||||
|
|
||||||
|
/// Width of the check mark.
|
||||||
|
public var checkWidth: CGFloat = 2 {
|
||||||
|
didSet {
|
||||||
|
if let shapeLayer = shapeLayer {
|
||||||
|
CATransaction.withDisabledAnimations {
|
||||||
|
shapeLayer.lineWidth = checkWidth
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Color of the check mark.
|
||||||
|
public var checkColor: UIColor = .black {
|
||||||
|
didSet {
|
||||||
|
setShapeLayerStrokeColor(checkColor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Border width of the checkbox
|
||||||
|
public var borderWidth: CGFloat = 1 {
|
||||||
|
didSet {
|
||||||
|
layer.borderWidth = borderWidth
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// border color of the Checkbox
|
||||||
|
public var borderColor: UIColor = .black {
|
||||||
|
didSet {
|
||||||
|
layer.borderColor = borderColor.cgColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
The represented state of the Checkbox.
|
||||||
|
|
||||||
|
Setting updateSelectionOnly to true bypasses the animation logic inherent with setting this property.
|
||||||
|
*/
|
||||||
|
override open var isSelected: Bool {
|
||||||
|
didSet {
|
||||||
|
if !updateSelectionOnly {
|
||||||
|
layoutIfNeeded()
|
||||||
|
shapeLayer?.removeAllAnimations()
|
||||||
|
|
||||||
|
updateCheckboxUI(isSelected: isSelected, isAnimated: isAnimated)
|
||||||
|
|
||||||
|
if let delegate = delegateObject as? FormValidationProtocol {
|
||||||
|
delegate.formValidatorModel?()?.enableByValidation()
|
||||||
|
}
|
||||||
|
|
||||||
|
updateAccessibilityLabel()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Constraints
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
private var heightConstraint: NSLayoutConstraint?
|
||||||
|
private var widthConstraint: NSLayoutConstraint?
|
||||||
|
|
||||||
|
/// Updates the height and width anchors of the Checkbox with the assigned value.
|
||||||
|
public var heigthWidthConstant: CGFloat = Checkbox.defaultHeightWidth {
|
||||||
|
didSet {
|
||||||
|
heightConstraint?.constant = heigthWidthConstant
|
||||||
|
widthConstraint?.constant = heigthWidthConstant
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Initializers
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
override public init(frame: CGRect) {
|
||||||
|
super.init(frame: frame)
|
||||||
|
|
||||||
|
accessibilityTraits = .button
|
||||||
|
accessibilityHint = MVMCoreUIUtility.hardcodedString(withKey: "checkbox_action_hint")
|
||||||
|
updateAccessibilityLabel()
|
||||||
|
setupView()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// There is currently no intention on using xib files.
|
||||||
|
required public init?(coder aDecoder: NSCoder) {
|
||||||
|
super.init(coder: aDecoder)
|
||||||
|
fatalError("xib file is not implemented for Checkbox.")
|
||||||
|
}
|
||||||
|
|
||||||
|
public convenience init() {
|
||||||
|
self.init(frame:.zero)
|
||||||
|
}
|
||||||
|
|
||||||
|
public convenience init(isChecked: Bool) {
|
||||||
|
self.init(frame: .zero)
|
||||||
|
updateSelectionOnly = true
|
||||||
|
isSelected = isChecked
|
||||||
|
updateSelectionOnly = false
|
||||||
|
}
|
||||||
|
|
||||||
|
public convenience init(checkedBackgroundColor: UIColor, unCheckedBackgroundColor: UIColor, isChecked: Bool = false) {
|
||||||
|
self.init(frame: .zero)
|
||||||
|
updateSelectionOnly = true
|
||||||
|
isSelected = isChecked
|
||||||
|
updateSelectionOnly = false
|
||||||
|
self.checkedBackgroundColor = checkedBackgroundColor
|
||||||
|
self.unCheckedBackgroundColor = unCheckedBackgroundColor
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Lifecycle
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
override open func layoutSubviews() {
|
||||||
|
super.layoutSubviews()
|
||||||
|
|
||||||
|
drawShapeLayer()
|
||||||
|
layer.cornerRadius = isRound ? cornerRadiusValue : 0
|
||||||
|
layer.borderWidth = borderWidth
|
||||||
|
layer.borderColor = borderColor.cgColor
|
||||||
|
}
|
||||||
|
|
||||||
|
open func setupView() {
|
||||||
|
|
||||||
|
guard constraints.isEmpty else { return }
|
||||||
|
|
||||||
|
isUserInteractionEnabled = true
|
||||||
|
translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
backgroundColor = .clear
|
||||||
|
|
||||||
|
widthConstraint = widthAnchor.constraint(equalToConstant: Checkbox.defaultHeightWidth)
|
||||||
|
heightConstraint = heightAnchor.constraint(equalToConstant: Checkbox.defaultHeightWidth)
|
||||||
|
heightWidthIsActive(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Actions
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
open override func sendAction(_ action: Selector, to target: Any?, for event: UIEvent?) {
|
||||||
|
super.sendAction(action, to: target, for: event)
|
||||||
|
toggleAndAction()
|
||||||
|
}
|
||||||
|
|
||||||
|
open override func sendActions(for controlEvents: UIControl.Event) {
|
||||||
|
super.sendActions(for: controlEvents)
|
||||||
|
toggleAndAction()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// This will toggle the state of the Checkbox and execute the actionBlock if provided.
|
||||||
|
public func toggleAndAction() {
|
||||||
|
|
||||||
|
isSelected.toggle()
|
||||||
|
actionBlock?()
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Methods
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
/// Creates the check mark layer.
|
||||||
|
private func drawShapeLayer() {
|
||||||
|
|
||||||
|
if shapeLayer == nil {
|
||||||
|
|
||||||
|
let shapeLayer = CAShapeLayer()
|
||||||
|
self.shapeLayer = shapeLayer
|
||||||
|
shapeLayer.frame = bounds
|
||||||
|
layer.addSublayer(shapeLayer)
|
||||||
|
shapeLayer.strokeColor = checkColor.cgColor
|
||||||
|
shapeLayer.fillColor = UIColor.clear.cgColor
|
||||||
|
shapeLayer.path = checkMarkPath()
|
||||||
|
shapeLayer.lineJoin = .miter
|
||||||
|
shapeLayer.lineWidth = checkWidth
|
||||||
|
|
||||||
|
CATransaction.withDisabledAnimations {
|
||||||
|
shapeLayer.strokeEnd = isSelected ? 1 : 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// - returns: The CGPath of a UIBezierPath detailing the path of a checkmark
|
||||||
|
func checkMarkPath() -> CGPath {
|
||||||
|
|
||||||
|
let length = max(bounds.size.height, bounds.size.width)
|
||||||
|
let xInsetLeft = length * 0.25
|
||||||
|
let yInsetTop = length * 0.3
|
||||||
|
let innerWidth = length - (xInsetLeft + length * 0.25) // + Right X Inset
|
||||||
|
let innerHeight = length - (yInsetTop + length * 0.35) // + Bottom Y Inset
|
||||||
|
|
||||||
|
let startPoint = CGPoint(x: xInsetLeft, y: yInsetTop + (innerHeight / 2))
|
||||||
|
let pivotOffSet = CGPoint(x: xInsetLeft + (innerWidth * 0.33), y: yInsetTop + innerHeight)
|
||||||
|
let endOffset = CGPoint(x: xInsetLeft + innerWidth, y: yInsetTop)
|
||||||
|
|
||||||
|
let bezierPath = UIBezierPath()
|
||||||
|
bezierPath.move(to: startPoint)
|
||||||
|
bezierPath.addLine(to: pivotOffSet)
|
||||||
|
bezierPath.addLine(to: endOffset)
|
||||||
|
|
||||||
|
return bezierPath.cgPath
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Programmatic means to check/uncheck the box.
|
||||||
|
/// - parameter selected: state of the check box: true = checked OR false = unchecked.
|
||||||
|
/// - parameter animated: allows the state of the checkbox to change with or without animation.
|
||||||
|
public func updateSelection(to selected: Bool, animated: Bool) {
|
||||||
|
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
|
||||||
|
self.updateSelectionOnly = true
|
||||||
|
self.isSelected = selected
|
||||||
|
self.updateSelectionOnly = false
|
||||||
|
self.drawShapeLayer()
|
||||||
|
self.shapeLayer?.removeAllAnimations()
|
||||||
|
self.updateCheckboxUI(isSelected: selected, isAnimated: animated)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// updates the visuals of the check mark and background.
|
||||||
|
/// - parameter isSelected: the check state of the checkbox.
|
||||||
|
/// - parameter isAnimated: determines of the changes should animate or immediately refelect.
|
||||||
|
public func updateCheckboxUI(isSelected: Bool, isAnimated: Bool) {
|
||||||
|
|
||||||
|
if isAnimated {
|
||||||
|
let animateStrokeEnd = CABasicAnimation(keyPath: "strokeEnd")
|
||||||
|
animateStrokeEnd.timingFunction = CAMediaTimingFunction(name: .linear)
|
||||||
|
animateStrokeEnd.duration = 0.3
|
||||||
|
animateStrokeEnd.fillMode = .both
|
||||||
|
animateStrokeEnd.isRemovedOnCompletion = false
|
||||||
|
animateStrokeEnd.fromValue = !isSelected ? 1 : 0
|
||||||
|
animateStrokeEnd.toValue = isSelected ? 1 : 0
|
||||||
|
self.shapeLayer?.add(animateStrokeEnd, forKey: "strokeEnd")
|
||||||
|
|
||||||
|
UIView.animate(withDuration: 0.2, delay: 0.1, options: .curveEaseOut, animations: {
|
||||||
|
self.backgroundColor = isSelected ? self.checkedBackgroundColor : self.unCheckedBackgroundColor
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
CATransaction.withDisabledAnimations {
|
||||||
|
self.shapeLayer?.strokeEnd = isSelected ? 1 : 0
|
||||||
|
}
|
||||||
|
|
||||||
|
backgroundColor = isSelected ? checkedBackgroundColor : unCheckedBackgroundColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Adjust accessibility label based on state of Checkbox.
|
||||||
|
func updateAccessibilityLabel() {
|
||||||
|
// Attention: This needs to be addressed with the accessibility team.
|
||||||
|
if let state = MVMCoreUIUtility.hardcodedString(withKey: isSelected ? "checkbox_checked_state" : "checkbox_unchecked_state") {
|
||||||
|
accessibilityLabel = String(format: MVMCoreUIUtility.hardcodedString(withKey: "checkbox_desc_state") ?? "%@", state)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func isEnabled(_ enabled: Bool) {
|
||||||
|
|
||||||
|
isUserInteractionEnabled = enabled
|
||||||
|
|
||||||
|
if enabled {
|
||||||
|
layer.borderColor = borderColor.cgColor
|
||||||
|
backgroundColor = isSelected ? checkedBackgroundColor : unCheckedBackgroundColor
|
||||||
|
alpha = 1.0
|
||||||
|
setShapeLayerStrokeColor(checkColor)
|
||||||
|
} else {
|
||||||
|
layer.borderColor = UIColor.mfSilver().cgColor
|
||||||
|
backgroundColor = .clear
|
||||||
|
alpha = DisableOppacity
|
||||||
|
setShapeLayerStrokeColor(UIColor.mfSilver())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func setShapeLayerStrokeColor(_ color: UIColor) {
|
||||||
|
|
||||||
|
if let shapeLayer = shapeLayer {
|
||||||
|
CATransaction.withDisabledAnimations {
|
||||||
|
shapeLayer.strokeColor = color.cgColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func heightWidthIsActive(_ isActive: Bool) {
|
||||||
|
|
||||||
|
heightConstraint?.isActive = isActive
|
||||||
|
widthConstraint?.isActive = isActive
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - UITouch
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
open override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
|
||||||
|
|
||||||
|
sendActions(for: touchIsAcceptablyOutside(touches.first) ? .touchUpOutside : .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
func touchIsAcceptablyOutside(_ touch: UITouch?) -> Bool {
|
||||||
|
let endLocation = touch?.location(in: self)
|
||||||
|
let x = endLocation?.x ?? 0.0
|
||||||
|
let y = endLocation?.y ?? 0.0
|
||||||
|
let faultTolerance: CGFloat = 20.0
|
||||||
|
let widthLimit = CGFloat(bounds.size.width + faultTolerance)
|
||||||
|
let heightLimt = CGFloat(bounds.size.height + faultTolerance)
|
||||||
|
|
||||||
|
return x < -faultTolerance || y < -faultTolerance || x > widthLimit || y > heightLimt
|
||||||
|
}
|
||||||
|
|
||||||
|
override open func accessibilityActivate() -> Bool {
|
||||||
|
sendActions(for: .touchUpInside)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Molecular
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
open func needsToBeConstrained() -> Bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
open func reset() {
|
||||||
|
|
||||||
|
isEnabled(true)
|
||||||
|
shapeLayer?.removeAllAnimations()
|
||||||
|
shapeLayer?.removeFromSuperlayer()
|
||||||
|
shapeLayer = nil
|
||||||
|
backgroundColor = .clear
|
||||||
|
borderColor = .black
|
||||||
|
borderWidth = 1.0
|
||||||
|
checkColor = .black
|
||||||
|
checkWidth = 2.0
|
||||||
|
updateSelectionOnly = true
|
||||||
|
isSelected = false
|
||||||
|
updateSelectionOnly = false
|
||||||
|
}
|
||||||
|
|
||||||
|
open func setAsMolecule() {
|
||||||
|
setupView()
|
||||||
|
}
|
||||||
|
|
||||||
|
public func updateView(_ size: CGFloat) {
|
||||||
|
|
||||||
|
layoutIfNeeded()
|
||||||
|
}
|
||||||
|
|
||||||
|
public func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
|
||||||
|
self.delegateObject = delegateObject
|
||||||
|
FormValidator.setupValidation(molecule: self, delegate: delegateObject?.formValidationProtocol)
|
||||||
|
|
||||||
|
guard let dictionary = json else { return }
|
||||||
|
|
||||||
|
if let fieldKey = dictionary[KeyFieldKey] as? String {
|
||||||
|
self.fieldKey = fieldKey
|
||||||
|
}
|
||||||
|
|
||||||
|
if let isRequired = dictionary[KeyRequired] as? Bool {
|
||||||
|
self.isRequired = isRequired
|
||||||
|
}
|
||||||
|
|
||||||
|
if let borderColorHex = dictionary["borderColor"] as? String {
|
||||||
|
layer.borderColor = UIColor.mfGet(forHex: borderColorHex).cgColor
|
||||||
|
}
|
||||||
|
|
||||||
|
if let borderWidth = dictionary["borderWidth"] as? CGFloat {
|
||||||
|
layer.borderWidth = borderWidth
|
||||||
|
}
|
||||||
|
|
||||||
|
if let isChecked = dictionary["isChecked"] as? Bool, isChecked {
|
||||||
|
updateSelectionOnly = true
|
||||||
|
isSelected = isChecked
|
||||||
|
updateSelectionOnly = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if let checkColorHex = dictionary["checkColor"] as? String {
|
||||||
|
checkColor = UIColor.mfGet(forHex: checkColorHex)
|
||||||
|
}
|
||||||
|
|
||||||
|
if let unCheckedBackgroundColorHex = dictionary["unCheckedBackgroundColor"] as? String {
|
||||||
|
unCheckedBackgroundColor = UIColor.mfGet(forHex: unCheckedBackgroundColorHex)
|
||||||
|
}
|
||||||
|
|
||||||
|
if let checkedBackgroundColorHex = dictionary["checkedBackgroundColor"] as? String {
|
||||||
|
checkedBackgroundColor = UIColor.mfGet(forHex: checkedBackgroundColorHex)
|
||||||
|
}
|
||||||
|
|
||||||
|
if let isAnimated = dictionary["isAnimated"] as? Bool {
|
||||||
|
self.isAnimated = isAnimated
|
||||||
|
}
|
||||||
|
|
||||||
|
if let isRound = dictionary["isRound"] as? Bool {
|
||||||
|
self.isRound = isRound
|
||||||
|
}
|
||||||
|
|
||||||
|
if let enabled = dictionary["isEnabled"] as? Bool {
|
||||||
|
isEnabled(enabled)
|
||||||
|
}
|
||||||
|
|
||||||
|
if let actionMap = dictionary.optionalDictionaryForKey("actionMap") {
|
||||||
|
actionBlock = { MVMCoreActionHandler.shared()?.handleAction(with: actionMap, additionalData: additionalData, delegateObject: delegateObject) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK:- FormValidationProtocol
|
||||||
|
extension Checkbox: FormValidationProtocol {
|
||||||
|
|
||||||
|
public func isValidField() -> Bool {
|
||||||
|
return isRequired ? isSelected : true
|
||||||
|
}
|
||||||
|
|
||||||
|
public func formFieldName() -> String? {
|
||||||
|
return fieldKey
|
||||||
|
}
|
||||||
|
|
||||||
|
public func formFieldValue() -> Any? {
|
||||||
|
return NSNumber(value: isSelected)
|
||||||
|
}
|
||||||
|
}
|
||||||
200
MVMCoreUI/Atoms/Views/CheckboxWithLabelView.swift
Normal file
200
MVMCoreUI/Atoms/Views/CheckboxWithLabelView.swift
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
//
|
||||||
|
// CheckboxWithLabelView.swift
|
||||||
|
// MVMCoreUI
|
||||||
|
//
|
||||||
|
// Created by Kevin Christiano on 9/13/19.
|
||||||
|
// Copyright © 2019 Verizon Wireless. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
@objcMembers open class CheckboxWithLabelView: ViewConstrainingView {
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Outlets
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
public let checkbox = Checkbox()
|
||||||
|
public let label = Label.commonLabelB2(true)
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Properties
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
var sizeObject: MFSizeObject? = MFSizeObject(standardSize: Checkbox.defaultHeightWidth, standardiPadPortraitSize: Checkbox.defaultHeightWidth + 6.0)
|
||||||
|
|
||||||
|
var checkboxPosition: CheckboxPosition = .center
|
||||||
|
|
||||||
|
public enum CheckboxPosition: String {
|
||||||
|
case center
|
||||||
|
case top
|
||||||
|
case bottom
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Constraints
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
var checkboxWidthConstraint: NSLayoutConstraint?
|
||||||
|
var checkboxHeightConstraint: NSLayoutConstraint?
|
||||||
|
var checkboxTopConstraint: NSLayoutConstraint?
|
||||||
|
var checkboxBottomConstraint: NSLayoutConstraint?
|
||||||
|
var checkboxCenterYConstraint: NSLayoutConstraint?
|
||||||
|
var centerLabelCheckboxConstraint: NSLayoutConstraint?
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Life Cycle
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
override open func setupView() {
|
||||||
|
super.setupView()
|
||||||
|
|
||||||
|
guard subviews.isEmpty else { return }
|
||||||
|
|
||||||
|
translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
|
||||||
|
addSubview(checkbox)
|
||||||
|
addSubview(label)
|
||||||
|
|
||||||
|
label.text = ""
|
||||||
|
|
||||||
|
let dimension = sizeObject?.getValueBasedOnApplicationWidth() ?? Checkbox.defaultHeightWidth
|
||||||
|
checkboxWidthConstraint = checkbox.heightAnchor.constraint(equalToConstant: dimension)
|
||||||
|
checkboxWidthConstraint?.isActive = true
|
||||||
|
checkboxHeightConstraint = checkbox.widthAnchor.constraint(equalToConstant: dimension)
|
||||||
|
checkboxHeightConstraint?.isActive = true
|
||||||
|
|
||||||
|
checkbox.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor).isActive = true
|
||||||
|
checkbox.topAnchor.constraint(greaterThanOrEqualTo: layoutMarginsGuide.topAnchor).isActive = true
|
||||||
|
layoutMarginsGuide.bottomAnchor.constraint(greaterThanOrEqualTo: checkbox.bottomAnchor).isActive = true
|
||||||
|
|
||||||
|
let checboxBottom = checkbox.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor)
|
||||||
|
checboxBottom.priority = UILayoutPriority(249)
|
||||||
|
checboxBottom.isActive = true
|
||||||
|
|
||||||
|
// Allows various positions of checkbox.
|
||||||
|
checkboxBottomConstraint = layoutMarginsGuide.bottomAnchor.constraint(equalTo: checkbox.bottomAnchor)
|
||||||
|
checkboxTopConstraint = checkbox.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor)
|
||||||
|
checkboxCenterYConstraint = checkbox.centerYAnchor.constraint(equalTo: centerYAnchor)
|
||||||
|
centerLabelCheckboxConstraint = label.centerYAnchor.constraint(equalTo: checkbox.centerYAnchor)
|
||||||
|
|
||||||
|
label.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor).isActive = true
|
||||||
|
layoutMarginsGuide.trailingAnchor.constraint(equalTo: label.trailingAnchor).isActive = true
|
||||||
|
label.leadingAnchor.constraint(equalTo: checkbox.trailingAnchor, constant: PaddingTwo).isActive = true
|
||||||
|
|
||||||
|
layoutMarginsGuide.bottomAnchor.constraint(greaterThanOrEqualTo: label.bottomAnchor).isActive = true
|
||||||
|
let bottomLabelConstraint = layoutMarginsGuide.bottomAnchor.constraint(equalTo: label.bottomAnchor)
|
||||||
|
bottomLabelConstraint.priority = UILayoutPriority(249)
|
||||||
|
bottomLabelConstraint.isActive = true
|
||||||
|
|
||||||
|
alignCheckbox(.center)
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Initializers
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
required public init?(coder: NSCoder) {
|
||||||
|
super.init(coder: coder)
|
||||||
|
fatalError("xib file is not implemented for CheckboxWithLabelView")
|
||||||
|
}
|
||||||
|
|
||||||
|
override public init(frame: CGRect) {
|
||||||
|
super.init(frame: frame)
|
||||||
|
setupView()
|
||||||
|
}
|
||||||
|
|
||||||
|
public convenience init() {
|
||||||
|
self.init(frame: .zero)
|
||||||
|
}
|
||||||
|
|
||||||
|
public convenience init(position: CheckboxPosition) {
|
||||||
|
self.init(frame: .zero)
|
||||||
|
|
||||||
|
alignCheckbox(position)
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Methods
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
/// Aligns Checkbox and Label relative to the desired position of the Checkbox.
|
||||||
|
private func alignCheckbox(_ position: CheckboxPosition) {
|
||||||
|
checkboxPosition = position
|
||||||
|
|
||||||
|
switch position {
|
||||||
|
case .center:
|
||||||
|
checkboxBottomConstraint?.isActive = false
|
||||||
|
checkboxTopConstraint?.isActive = false
|
||||||
|
checkboxCenterYConstraint?.isActive = true
|
||||||
|
centerLabelCheckboxConstraint?.isActive = true
|
||||||
|
|
||||||
|
case .top:
|
||||||
|
checkboxBottomConstraint?.isActive = false
|
||||||
|
checkboxTopConstraint?.isActive = true
|
||||||
|
checkboxCenterYConstraint?.isActive = false
|
||||||
|
centerLabelCheckboxConstraint?.isActive = false
|
||||||
|
|
||||||
|
case .bottom:
|
||||||
|
checkboxBottomConstraint?.isActive = true
|
||||||
|
checkboxTopConstraint?.isActive = false
|
||||||
|
checkboxCenterYConstraint?.isActive = false
|
||||||
|
centerLabelCheckboxConstraint?.isActive = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// MARK: - Molecular
|
||||||
|
extension CheckboxWithLabelView {
|
||||||
|
|
||||||
|
override open class func estimatedHeight(forRow json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat {
|
||||||
|
return CGFloat(Checkbox.defaultHeightWidth)
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc override open func updateView(_ size: CGFloat) {
|
||||||
|
super.updateView(size)
|
||||||
|
|
||||||
|
label.updateView(size)
|
||||||
|
|
||||||
|
if self.checkbox.responds(to: #selector(self.updateView(_:))) {
|
||||||
|
if let dimension = sizeObject?.getValueBased(onSize: size) {
|
||||||
|
checkboxWidthConstraint?.constant = dimension
|
||||||
|
checkboxHeightConstraint?.constant = dimension
|
||||||
|
checkbox.updateView(size)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
layoutIfNeeded()
|
||||||
|
}
|
||||||
|
|
||||||
|
override open func alignment() -> UIStackView.Alignment {
|
||||||
|
return .leading
|
||||||
|
}
|
||||||
|
|
||||||
|
open override func resetConstraints() {
|
||||||
|
super.resetConstraints()
|
||||||
|
|
||||||
|
checkboxCenterYConstraint?.isActive = false
|
||||||
|
checkboxBottomConstraint?.isActive = false
|
||||||
|
checkboxTopConstraint?.isActive = false
|
||||||
|
centerLabelCheckboxConstraint?.isActive = false
|
||||||
|
}
|
||||||
|
|
||||||
|
open override func reset() {
|
||||||
|
super.reset()
|
||||||
|
|
||||||
|
label.text = ""
|
||||||
|
checkbox.reset()
|
||||||
|
}
|
||||||
|
|
||||||
|
override open func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
|
||||||
|
super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
|
||||||
|
|
||||||
|
guard let dictionary = json else { return }
|
||||||
|
|
||||||
|
if let checkboxAlignment = dictionary["checkboxAlignment"] as? String, let position = CheckboxPosition(rawValue: checkboxAlignment) {
|
||||||
|
alignCheckbox(position)
|
||||||
|
}
|
||||||
|
|
||||||
|
checkbox.setWithJSON(dictionary.dictionaryForKey("checkbox"), delegateObject: delegateObject, additionalData: additionalData)
|
||||||
|
label.setWithJSON(dictionary.dictionaryForKey("label"), delegateObject: delegateObject, additionalData: additionalData)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -26,6 +26,9 @@ public typealias ActionBlock = () -> ()
|
|||||||
public var sizeObject: MFSizeObject?
|
public var sizeObject: MFSizeObject?
|
||||||
public var scaleSize: NSNumber?
|
public var scaleSize: NSNumber?
|
||||||
|
|
||||||
|
/// A specific text index to use as a unique marker.
|
||||||
|
public var hero: Int?
|
||||||
|
|
||||||
// Used for scaling the font in updateView.
|
// Used for scaling the font in updateView.
|
||||||
private var originalAttributedString: NSAttributedString?
|
private var originalAttributedString: NSAttributedString?
|
||||||
|
|
||||||
@ -502,6 +505,50 @@ public typealias ActionBlock = () -> ()
|
|||||||
let accessibleAction = customAccessibilityAction(range: range)
|
let accessibleAction = customAccessibilityAction(range: range)
|
||||||
clauses.append(ActionableClause(range: range, actionBlock: actionBlock, accessibilityID: accessibleAction?.hash ?? -1))
|
clauses.append(ActionableClause(range: range, actionBlock: actionBlock, accessibilityID: accessibleAction?.hash ?? -1))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Provides a text container and layout manager of how the text would appear on screen.
|
||||||
|
They are used in tandem to derive low-level TextKit results of the label.
|
||||||
|
*/
|
||||||
|
public func abstractTextContainer() -> (NSTextContainer, NSLayoutManager, NSTextStorage)? {
|
||||||
|
|
||||||
|
// Must configure the attributed string to translate what would appear on screen to accurately analyze.
|
||||||
|
guard let attributedText = attributedText else { return nil }
|
||||||
|
|
||||||
|
let paragraph = NSMutableParagraphStyle()
|
||||||
|
paragraph.alignment = textAlignment
|
||||||
|
|
||||||
|
let stagedAttributedString = NSMutableAttributedString(attributedString: attributedText)
|
||||||
|
stagedAttributedString.addAttributes([NSAttributedString.Key.paragraphStyle: paragraph], range: NSRange(location: 0, length: attributedText.string.count))
|
||||||
|
|
||||||
|
let textStorage = NSTextStorage(attributedString: stagedAttributedString)
|
||||||
|
let layoutManager = NSLayoutManager()
|
||||||
|
let textContainer = NSTextContainer(size: .zero)
|
||||||
|
|
||||||
|
layoutManager.addTextContainer(textContainer)
|
||||||
|
textStorage.addLayoutManager(layoutManager)
|
||||||
|
|
||||||
|
textContainer.lineFragmentPadding = 0.0
|
||||||
|
textContainer.lineBreakMode = lineBreakMode
|
||||||
|
textContainer.maximumNumberOfLines = numberOfLines
|
||||||
|
textContainer.size = bounds.size
|
||||||
|
|
||||||
|
return (textContainer, layoutManager, textStorage)
|
||||||
|
}
|
||||||
|
|
||||||
|
public static func boundingRect(forCharacterRange range: NSRange, in label: Label) -> CGRect {
|
||||||
|
|
||||||
|
guard let abstractContainer = label.abstractTextContainer() else { return CGRect() }
|
||||||
|
let textContainer = abstractContainer.0
|
||||||
|
let layoutManager = abstractContainer.1
|
||||||
|
|
||||||
|
var glyphRange = NSRange()
|
||||||
|
|
||||||
|
// Convert the range for glyphs.
|
||||||
|
layoutManager.characterRange(forGlyphRange: range, actualGlyphRange: &glyphRange)
|
||||||
|
|
||||||
|
return layoutManager.boundingRect(forGlyphRange: glyphRange, in: textContainer)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Atomization
|
// MARK: - Atomization
|
||||||
@ -521,6 +568,8 @@ extension Label {
|
|||||||
clauses = []
|
clauses = []
|
||||||
Label.setUILabel(self, withJSON: json, delegate: delegateObject, additionalData: additionalData)
|
Label.setUILabel(self, withJSON: json, delegate: delegateObject, additionalData: additionalData)
|
||||||
originalAttributedString = attributedText
|
originalAttributedString = attributedText
|
||||||
|
|
||||||
|
hero = json?["hero"] as? Int
|
||||||
}
|
}
|
||||||
|
|
||||||
public func setAsMolecule() {
|
public func setAsMolecule() {
|
||||||
@ -634,26 +683,9 @@ extension UITapGestureRecognizer {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Must configure the attributed string to translate what would appear on screen to accurately analyze.
|
guard let abstractContainer = label.abstractTextContainer() else { return false }
|
||||||
guard let attributedText = label.attributedText else { return false }
|
let textContainer = abstractContainer.0
|
||||||
|
let layoutManager = abstractContainer.1
|
||||||
let paragraph = NSMutableParagraphStyle()
|
|
||||||
paragraph.alignment = label.textAlignment
|
|
||||||
|
|
||||||
let stagedAttributedString = NSMutableAttributedString(attributedString: attributedText)
|
|
||||||
stagedAttributedString.addAttributes([NSAttributedString.Key.paragraphStyle: paragraph], range: NSRange(location: 0, length: attributedText.string.count))
|
|
||||||
|
|
||||||
let textStorage = NSTextStorage(attributedString: stagedAttributedString)
|
|
||||||
let layoutManager = NSLayoutManager()
|
|
||||||
let textContainer = NSTextContainer(size: .zero)
|
|
||||||
|
|
||||||
layoutManager.addTextContainer(textContainer)
|
|
||||||
textStorage.addLayoutManager(layoutManager)
|
|
||||||
|
|
||||||
textContainer.lineFragmentPadding = 0.0
|
|
||||||
textContainer.lineBreakMode = label.lineBreakMode
|
|
||||||
textContainer.maximumNumberOfLines = label.numberOfLines
|
|
||||||
textContainer.size = label.bounds.size
|
|
||||||
|
|
||||||
let indexOfGlyph = layoutManager.glyphIndex(for: location(in: label), in: textContainer)
|
let indexOfGlyph = layoutManager.glyphIndex(for: location(in: label), in: textContainer)
|
||||||
|
|
||||||
|
|||||||
@ -173,11 +173,10 @@
|
|||||||
view.placeHolderLabel.textColor = [UIColor mfLightGrayColor];
|
view.placeHolderLabel.textColor = [UIColor mfLightGrayColor];
|
||||||
|
|
||||||
// Disable SmartQuotes
|
// Disable SmartQuotes
|
||||||
if (@available(iOS 11.0, *)) {
|
view.textView.smartQuotesType = UITextSmartQuotesTypeNo;
|
||||||
view.textView.smartQuotesType = UITextSmartQuotesTypeNo;
|
view.textView.smartDashesType = UITextSmartDashesTypeNo;
|
||||||
view.textView.smartDashesType = UITextSmartDashesTypeNo;
|
view.textView.smartInsertDeleteType = UITextSmartInsertDeleteTypeNo;
|
||||||
view.textView.smartInsertDeleteType = UITextSmartInsertDeleteTypeNo;
|
|
||||||
}
|
|
||||||
[view didSetFont:view.textView.font];
|
[view didSetFont:view.textView.font];
|
||||||
view.hideBorder = YES;
|
view.hideBorder = YES;
|
||||||
return view;
|
return view;
|
||||||
|
|||||||
@ -48,9 +48,7 @@
|
|||||||
|
|
||||||
- (void)setAsMolecule {
|
- (void)setAsMolecule {
|
||||||
self.translatesAutoresizingMaskIntoConstraints = NO;
|
self.translatesAutoresizingMaskIntoConstraints = NO;
|
||||||
if (@available(iOS 11.0, *)) {
|
self.insetsLayoutMarginsFromSafeArea = NO;
|
||||||
self.insetsLayoutMarginsFromSafeArea = NO;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)reset {
|
- (void)reset {
|
||||||
|
|||||||
@ -306,6 +306,8 @@ static const CGFloat CheckBoxHeightWidth = 18.0;
|
|||||||
self.checkedSquare.layer.cornerRadius = self.isRoundRectCheckMark ? 5.0f : 0;
|
self.checkedSquare.layer.cornerRadius = self.isRoundRectCheckMark ? 5.0f : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO:.....................................
|
||||||
|
|
||||||
#pragma mark - XIB Helpers
|
#pragma mark - XIB Helpers
|
||||||
|
|
||||||
- (instancetype)awakeAfterUsingCoder:(NSCoder *)aDecoder {
|
- (instancetype)awakeAfterUsingCoder:(NSCoder *)aDecoder {
|
||||||
|
|||||||
@ -61,12 +61,8 @@
|
|||||||
tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
|
tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
|
||||||
tableView.delegate = self;
|
tableView.delegate = self;
|
||||||
tableView.dataSource = self;
|
tableView.dataSource = self;
|
||||||
if (@available(iOS 11.0, *)) {
|
tableView.insetsContentViewsToSafeArea = NO;
|
||||||
tableView.insetsContentViewsToSafeArea = NO;
|
tableView.cellLayoutMarginsFollowReadableWidth = NO;
|
||||||
}
|
|
||||||
if ([tableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)]) {
|
|
||||||
tableView.cellLayoutMarginsFollowReadableWidth = NO;
|
|
||||||
}
|
|
||||||
return tableView;
|
return tableView;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -91,10 +91,7 @@ static NSTimeInterval const HandScrollAnimationTiming = 7.f;
|
|||||||
- (void)viewDidLayoutSubviews {
|
- (void)viewDidLayoutSubviews {
|
||||||
[super viewDidLayoutSubviews];
|
[super viewDidLayoutSubviews];
|
||||||
|
|
||||||
BOOL automaticInset = NO;
|
BOOL automaticInset = self.navigationController && self.scrollView.contentInsetAdjustmentBehavior == UIScrollViewContentInsetAdjustmentAutomatic;
|
||||||
if (@available(iOS 11.0, *)) {
|
|
||||||
automaticInset = self.navigationController && self.scrollView.contentInsetAdjustmentBehavior == UIScrollViewContentInsetAdjustmentAutomatic;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Takes into account the navigation bar.
|
// Takes into account the navigation bar.
|
||||||
if (!automaticInset && (self.edgesForExtendedLayout & UIRectEdgeTop)) {
|
if (!automaticInset && (self.edgesForExtendedLayout & UIRectEdgeTop)) {
|
||||||
|
|||||||
@ -527,6 +527,13 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)viewWillDisappear:(BOOL)animated {
|
||||||
|
[super viewWillDisappear:animated];
|
||||||
|
if (self.selectedField) {
|
||||||
|
[self.selectedField resignFirstResponder];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void)dealloc {
|
- (void)dealloc {
|
||||||
[self stopObservingForResponseJSONUpdates];
|
[self stopObservingForResponseJSONUpdates];
|
||||||
MVMCoreLog(@"%@ deallocated", [[self class] description]);
|
MVMCoreLog(@"%@ deallocated", [[self class] description]);
|
||||||
|
|||||||
@ -195,13 +195,9 @@ open class ThreeLayerTableViewController: MFProgrammaticTableViewController {
|
|||||||
footerView.topAnchor.constraint(equalTo: tableView.bottomAnchor).isActive = true
|
footerView.topAnchor.constraint(equalTo: tableView.bottomAnchor).isActive = true
|
||||||
footerView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
|
footerView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
|
||||||
view.rightAnchor.constraint(equalTo: footerView.rightAnchor).isActive = true
|
view.rightAnchor.constraint(equalTo: footerView.rightAnchor).isActive = true
|
||||||
if #available(iOS 11.0, *) {
|
view.safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: footerView.bottomAnchor).isActive = true
|
||||||
view.safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: footerView.bottomAnchor).isActive = true
|
safeAreaView = MVMCoreUICommonViewsUtility.getAndSetupSafeAreaView(on: view)
|
||||||
safeAreaView = MVMCoreUICommonViewsUtility.getAndSetupSafeAreaView(on: view)
|
safeAreaView?.backgroundColor = bottomView?.backgroundColor
|
||||||
safeAreaView?.backgroundColor = bottomView?.backgroundColor
|
|
||||||
} else {
|
|
||||||
view.bottomAnchor.constraint(equalTo: footerView.bottomAnchor).isActive = true
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
bottomConstraint?.isActive = true
|
bottomConstraint?.isActive = true
|
||||||
var y: CGFloat?
|
var y: CGFloat?
|
||||||
|
|||||||
@ -45,7 +45,7 @@ open class ThreeLayerViewController: ProgrammaticScrollViewController {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if #available(iOS 11.0, *), scrollView.contentInsetAdjustmentBehavior == UIScrollView.ContentInsetAdjustmentBehavior.automatic {
|
if scrollView.contentInsetAdjustmentBehavior == UIScrollView.ContentInsetAdjustmentBehavior.automatic {
|
||||||
heightConstraint?.constant = -scrollView.adjustedContentInset.top - scrollView.adjustedContentInset.bottom
|
heightConstraint?.constant = -scrollView.adjustedContentInset.top - scrollView.adjustedContentInset.bottom
|
||||||
} else {
|
} else {
|
||||||
heightConstraint?.constant = -scrollView.contentInset.top - scrollView.contentInset.bottom
|
heightConstraint?.constant = -scrollView.contentInset.top - scrollView.contentInset.bottom
|
||||||
@ -233,14 +233,10 @@ extension ThreeLayerViewController {
|
|||||||
view.topAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
|
view.topAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
|
||||||
NSLayoutConstraint.pinViewLeft(toSuperview: view, useMargins: useMargins, constant: 0).isActive = true
|
NSLayoutConstraint.pinViewLeft(toSuperview: view, useMargins: useMargins, constant: 0).isActive = true
|
||||||
NSLayoutConstraint.pinViewRight(toSuperview: view, useMargins: useMargins, constant: 0).isActive = true
|
NSLayoutConstraint.pinViewRight(toSuperview: view, useMargins: useMargins, constant: 0).isActive = true
|
||||||
if #available(iOS 11.0, *) {
|
parentView.safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
|
||||||
parentView.safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
|
if let safeAreaView = MVMCoreUICommonViewsUtility.getAndSetupSafeAreaView(on: parentView) {
|
||||||
if let safeAreaView = MVMCoreUICommonViewsUtility.getAndSetupSafeAreaView(on: parentView) {
|
safeAreaView.backgroundColor = bottomView?.backgroundColor
|
||||||
safeAreaView.backgroundColor = bottomView?.backgroundColor
|
self.safeAreaView = safeAreaView
|
||||||
self.safeAreaView = safeAreaView
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
NSLayoutConstraint.pinViewBottom(toSuperview: view, useMargins: useMargins, constant: 0).isActive = true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -283,16 +283,6 @@
|
|||||||
|
|
||||||
// So we will update titles.
|
// So we will update titles.
|
||||||
[self newDataBuildScreen];
|
[self newDataBuildScreen];
|
||||||
|
|
||||||
// Fix for right bar button item with custom view which disappears when user navigates to top tabbar page controller
|
|
||||||
if (@available(iOS 11.0, *)) {
|
|
||||||
} else {
|
|
||||||
NSMutableArray *buttonItems = [[NSMutableArray alloc] init];
|
|
||||||
UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:self action:nil];
|
|
||||||
[buttonItems addObject:space];
|
|
||||||
[buttonItems addObjectsFromArray:self.navigationItem.rightBarButtonItems];
|
|
||||||
self.navigationItem.rightBarButtonItems = buttonItems;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)viewWillDisappear:(BOOL)animated {
|
- (void)viewWillDisappear:(BOOL)animated {
|
||||||
|
|||||||
@ -325,19 +325,13 @@
|
|||||||
NSLayoutConstraint *bottomViewTop = [NSLayoutConstraint constraintWithItem:footerView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:tableView attribute:NSLayoutAttributeBottom multiplier:1 constant:0];
|
NSLayoutConstraint *bottomViewTop = [NSLayoutConstraint constraintWithItem:footerView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:tableView attribute:NSLayoutAttributeBottom multiplier:1 constant:0];
|
||||||
bottomViewTop.active = YES;
|
bottomViewTop.active = YES;
|
||||||
|
|
||||||
NSLayoutConstraint *bottomViewBot = nil;
|
NSLayoutConstraint *bottomViewBot = [self.view.safeAreaLayoutGuide.bottomAnchor constraintEqualToAnchor:footerView.bottomAnchor];
|
||||||
if (@available(iOS 11.0, *)) {
|
bottomViewBot.priority = 900;
|
||||||
bottomViewBot = [self.view.safeAreaLayoutGuide.bottomAnchor constraintEqualToAnchor:footerView.bottomAnchor];
|
bottomViewBot.active = YES;
|
||||||
|
|
||||||
UIView *safeAreaView = [MVMCoreUICommonViewsUtility getAndSetupSafeAreaViewOnView:self.view];
|
UIView *safeAreaView = [MVMCoreUICommonViewsUtility getAndSetupSafeAreaViewOnView:self.view];
|
||||||
safeAreaView.backgroundColor = footerView.backgroundColor;
|
safeAreaView.backgroundColor = footerView.backgroundColor;
|
||||||
self.safeAreaView = safeAreaView;
|
self.safeAreaView = safeAreaView;
|
||||||
} else {
|
|
||||||
// Fallback on earlier versions
|
|
||||||
bottomViewBot = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:footerView attribute:NSLayoutAttributeBottom multiplier:1 constant:0];
|
|
||||||
}
|
|
||||||
bottomViewBot.priority = 900;
|
|
||||||
bottomViewBot.active = YES;
|
|
||||||
|
|
||||||
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[footerView]-0@900-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(footerView)]];
|
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[footerView]-0@900-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(footerView)]];
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -272,13 +272,8 @@
|
|||||||
- (void)updateViewConstraints {
|
- (void)updateViewConstraints {
|
||||||
[super updateViewConstraints];
|
[super updateViewConstraints];
|
||||||
|
|
||||||
// Updates for ios 11
|
if (self.scrollView.contentInsetAdjustmentBehavior == UIScrollViewContentInsetAdjustmentAutomatic) {
|
||||||
if (@available(iOS 11.0, *)) {
|
self.heightConstraint.constant = -self.scrollView.adjustedContentInset.top - self.scrollView.adjustedContentInset.bottom;
|
||||||
if (self.scrollView.contentInsetAdjustmentBehavior == UIScrollViewContentInsetAdjustmentAutomatic) {
|
|
||||||
self.heightConstraint.constant = -self.scrollView.adjustedContentInset.top - self.scrollView.adjustedContentInset.bottom;
|
|
||||||
} else {
|
|
||||||
self.heightConstraint.constant = -self.scrollView.contentInset.top - self.scrollView.contentInset.bottom;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
self.heightConstraint.constant = -self.scrollView.contentInset.top - self.scrollView.contentInset.bottom;
|
self.heightConstraint.constant = -self.scrollView.contentInset.top - self.scrollView.contentInset.bottom;
|
||||||
}
|
}
|
||||||
@ -322,17 +317,13 @@
|
|||||||
[self.view addSubview:bottomView];
|
[self.view addSubview:bottomView];
|
||||||
|
|
||||||
UIScrollView *scrollview = self.scrollView;
|
UIScrollView *scrollview = self.scrollView;
|
||||||
if (@available(iOS 11.0, *)) {
|
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[scrollview]-0-[bottomView]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(scrollview,bottomView)]];
|
||||||
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[scrollview]-0-[bottomView]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(scrollview,bottomView)]];
|
[self.view.safeAreaLayoutGuide.bottomAnchor constraintEqualToAnchor:bottomView.bottomAnchor].active = YES;
|
||||||
[self.view.safeAreaLayoutGuide.bottomAnchor constraintEqualToAnchor:bottomView.bottomAnchor].active = YES;
|
|
||||||
|
UIView *safeAreaView = [MVMCoreUICommonViewsUtility getAndSetupSafeAreaViewOnView:self.view];
|
||||||
|
safeAreaView.backgroundColor = bottomView.backgroundColor;
|
||||||
|
self.safeAreaView = safeAreaView;
|
||||||
|
|
||||||
UIView *safeAreaView = [MVMCoreUICommonViewsUtility getAndSetupSafeAreaViewOnView:self.view];
|
|
||||||
safeAreaView.backgroundColor = bottomView.backgroundColor;
|
|
||||||
self.safeAreaView = safeAreaView;
|
|
||||||
} else {
|
|
||||||
// Fallback on earlier versions
|
|
||||||
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[scrollview]-0-[bottomView]-0-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(scrollview,bottomView)]];
|
|
||||||
}
|
|
||||||
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[bottomView]-0@900-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(bottomView)]];
|
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[bottomView]-0@900-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(bottomView)]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -37,11 +37,9 @@ open class MoleculeCollectionViewCell: UICollectionViewCell, MVMCoreUIMoleculeVi
|
|||||||
}
|
}
|
||||||
isAccessibilityElement = false
|
isAccessibilityElement = false
|
||||||
contentView.isAccessibilityElement = false
|
contentView.isAccessibilityElement = false
|
||||||
if #available(iOS 11.0, *) {
|
insetsLayoutMarginsFromSafeArea = false
|
||||||
insetsLayoutMarginsFromSafeArea = false
|
contentView.insetsLayoutMarginsFromSafeArea = false
|
||||||
contentView.insetsLayoutMarginsFromSafeArea = false
|
contentView.preservesSuperviewLayoutMargins = false
|
||||||
contentView.preservesSuperviewLayoutMargins = false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Covers the card when peaking.
|
// Covers the card when peaking.
|
||||||
peakingCover.backgroundColor = .white
|
peakingCover.backgroundColor = .white
|
||||||
|
|||||||
@ -53,6 +53,17 @@ import UIKit
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open override func layoutSubviews() {
|
||||||
|
super.layoutSubviews()
|
||||||
|
|
||||||
|
// Ensures accessory view aligns to the center y derived from the
|
||||||
|
if let center = heroAccessoryCenter {
|
||||||
|
accessoryView?.center.y = center.y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var heroAccessoryCenter: CGPoint?
|
||||||
|
|
||||||
func styleStandard() {
|
func styleStandard() {
|
||||||
topMarginPadding = 24
|
topMarginPadding = 24
|
||||||
bottomMarginPadding = 24
|
bottomMarginPadding = 24
|
||||||
@ -73,6 +84,11 @@ import UIKit
|
|||||||
bottomSeparatorView?.hide()
|
bottomSeparatorView?.hide()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func willDisplay() {
|
||||||
|
|
||||||
|
alignAccessoryToHero()
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Inits
|
// MARK: - Inits
|
||||||
public override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
|
public override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
|
||||||
super.init(style: style, reuseIdentifier: reuseIdentifier)
|
super.init(style: style, reuseIdentifier: reuseIdentifier)
|
||||||
@ -87,29 +103,16 @@ import UIKit
|
|||||||
// MARK: - MFViewProtocol
|
// MARK: - MFViewProtocol
|
||||||
public func updateView(_ size: CGFloat) {
|
public func updateView(_ size: CGFloat) {
|
||||||
MFStyler.setMarginsFor(self, size: size, defaultHorizontal: updateViewHorizontalDefaults, top: topMarginPadding, bottom: bottomMarginPadding)
|
MFStyler.setMarginsFor(self, size: size, defaultHorizontal: updateViewHorizontalDefaults, top: topMarginPadding, bottom: bottomMarginPadding)
|
||||||
if #available(iOS 11.0, *) {
|
if accessoryView != nil {
|
||||||
if accessoryView != nil {
|
// Smaller left margin if accessory view.
|
||||||
// Smaller left margin if accessory view.
|
var margin = directionalLayoutMargins
|
||||||
var margin = directionalLayoutMargins
|
margin.trailing = 16
|
||||||
margin.trailing = 16
|
contentView.directionalLayoutMargins = margin
|
||||||
contentView.directionalLayoutMargins = margin
|
|
||||||
} else {
|
|
||||||
contentView.directionalLayoutMargins = directionalLayoutMargins
|
|
||||||
}
|
|
||||||
topSeparatorView?.setLeftAndRightPinConstant(directionalLayoutMargins.leading)
|
|
||||||
bottomSeparatorView?.setLeftAndRightPinConstant(directionalLayoutMargins.leading)
|
|
||||||
} else {
|
} else {
|
||||||
if accessoryView != nil {
|
contentView.directionalLayoutMargins = directionalLayoutMargins
|
||||||
// Smaller left margin if accessory view.
|
|
||||||
var margin = layoutMargins
|
|
||||||
margin.right = 16
|
|
||||||
contentView.layoutMargins = margin
|
|
||||||
} else {
|
|
||||||
contentView.layoutMargins = layoutMargins
|
|
||||||
}
|
|
||||||
topSeparatorView?.setLeftAndRightPinConstant(layoutMargins.left)
|
|
||||||
bottomSeparatorView?.setLeftAndRightPinConstant(layoutMargins.left)
|
|
||||||
}
|
}
|
||||||
|
topSeparatorView?.setLeftAndRightPinConstant(directionalLayoutMargins.leading)
|
||||||
|
bottomSeparatorView?.setLeftAndRightPinConstant(directionalLayoutMargins.leading)
|
||||||
|
|
||||||
molecule?.updateView(size)
|
molecule?.updateView(size)
|
||||||
if let _ = accessoryView, let caretView = caretView, let widthObject = caretViewWidthSizeObject, let heightObject = caretViewHeightSizeObject {
|
if let _ = accessoryView, let caretView = caretView, let widthObject = caretViewWidthSizeObject, let heightObject = caretViewHeightSizeObject {
|
||||||
@ -121,22 +124,52 @@ import UIKit
|
|||||||
|
|
||||||
public func setupView() {
|
public func setupView() {
|
||||||
selectionStyle = .none
|
selectionStyle = .none
|
||||||
if #available(iOS 11.0, *) {
|
insetsLayoutMarginsFromSafeArea = false
|
||||||
insetsLayoutMarginsFromSafeArea = false
|
contentView.insetsLayoutMarginsFromSafeArea = false
|
||||||
contentView.insetsLayoutMarginsFromSafeArea = false
|
contentView.preservesSuperviewLayoutMargins = false
|
||||||
contentView.preservesSuperviewLayoutMargins = false
|
}
|
||||||
|
|
||||||
|
/// NOTE: Should only be called when displayed or about to be displayed.
|
||||||
|
public func alignAccessoryToHero() {
|
||||||
|
|
||||||
|
// Layout call required to force draw in memory to get dimensions of subviews.
|
||||||
|
layoutIfNeeded()
|
||||||
|
guard let heroLabel = findHeroLabel(views: contentView.subviews), let hero = heroLabel.hero else { return }
|
||||||
|
let rect = Label.boundingRect(forCharacterRange: NSRange(location: hero, length: 1), in: heroLabel)
|
||||||
|
accessoryView?.center.y = contentView.convert(UIView(frame: rect).center, from: heroLabel).y
|
||||||
|
heroAccessoryCenter = accessoryView?.center
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Traverses the view hierarchy for a 🦸♂️heroic Label.
|
||||||
|
private func findHeroLabel(views: [UIView]) -> Label? {
|
||||||
|
|
||||||
|
if views.isEmpty {
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var queue = [UIView]()
|
||||||
|
|
||||||
|
for view in views {
|
||||||
|
// Only one Label will have a hero in a table cell.
|
||||||
|
if let label = view as? Label, label.hero != nil {
|
||||||
|
return label
|
||||||
|
}
|
||||||
|
queue.append(contentsOf: view.subviews)
|
||||||
|
}
|
||||||
|
|
||||||
|
return findHeroLabel(views: queue)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - MVMCoreUIMoleculeViewProtocol
|
// MARK: - MVMCoreUIMoleculeViewProtocol
|
||||||
public func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
|
public func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
|
||||||
self.json = json;
|
self.json = json
|
||||||
|
|
||||||
style(with: json?.optionalStringForKey("style"))
|
style(with: json?.optionalStringForKey("style"))
|
||||||
|
|
||||||
if let useHorizontalMargins = json?.optionalBoolForKey("useHorizontalMargins") {
|
if let useHorizontalMargins = json?.optionalBoolForKey("useHorizontalMargins") {
|
||||||
updateViewHorizontalDefaults = useHorizontalMargins
|
updateViewHorizontalDefaults = useHorizontalMargins
|
||||||
}
|
}
|
||||||
|
|
||||||
if (json?.optionalBoolForKey("useVerticalMargins") ?? true) == false {
|
if (json?.optionalBoolForKey("useVerticalMargins") ?? true) == false {
|
||||||
topMarginPadding = 0
|
topMarginPadding = 0
|
||||||
bottomMarginPadding = 0
|
bottomMarginPadding = 0
|
||||||
@ -161,9 +194,8 @@ import UIKit
|
|||||||
bottomSeparatorView?.setWithJSON(separator, delegateObject: delegateObject, additionalData: additionalData)
|
bottomSeparatorView?.setWithJSON(separator, delegateObject: delegateObject, additionalData: additionalData)
|
||||||
}
|
}
|
||||||
|
|
||||||
guard let json = json, let moleculeJSON = json.optionalDictionaryForKey(KeyMolecule) else {
|
guard let json = json, let moleculeJSON = json.optionalDictionaryForKey(KeyMolecule) else { return }
|
||||||
return
|
|
||||||
}
|
|
||||||
if molecule == nil {
|
if molecule == nil {
|
||||||
if let moleculeView = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(forJSON: moleculeJSON, delegateObject: delegateObject, constrainIfNeeded: true) {
|
if let moleculeView = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(forJSON: moleculeJSON, delegateObject: delegateObject, constrainIfNeeded: true) {
|
||||||
contentView.addSubview(moleculeView)
|
contentView.addSubview(moleculeView)
|
||||||
@ -214,10 +246,8 @@ import UIKit
|
|||||||
|
|
||||||
// MARK: - Arrow
|
// MARK: - Arrow
|
||||||
/// Adds the standard mvm style caret to the accessory view
|
/// Adds the standard mvm style caret to the accessory view
|
||||||
public func addCaretViewAccessory() {
|
@objc public func addCaretViewAccessory() {
|
||||||
guard accessoryView == nil else {
|
guard accessoryView == nil else { return }
|
||||||
return
|
|
||||||
}
|
|
||||||
let width: CGFloat = 6
|
let width: CGFloat = 6
|
||||||
let height: CGFloat = 10
|
let height: CGFloat = 10
|
||||||
caretView = CaretView(lineThickness: CaretView.thin)
|
caretView = CaretView(lineThickness: CaretView.thin)
|
||||||
|
|||||||
@ -24,7 +24,6 @@
|
|||||||
/// Resets to default state before set with json is called again.
|
/// Resets to default state before set with json is called again.
|
||||||
- (void)reset;
|
- (void)reset;
|
||||||
|
|
||||||
|
|
||||||
/// For the molecule list to load more efficiently.
|
/// For the molecule list to load more efficiently.
|
||||||
+ (CGFloat)estimatedHeightForRow:(nullable NSDictionary *)json delegateObject:(nullable MVMCoreUIDelegateObject *)delegateObject;
|
+ (CGFloat)estimatedHeightForRow:(nullable NSDictionary *)json delegateObject:(nullable MVMCoreUIDelegateObject *)delegateObject;
|
||||||
|
|
||||||
|
|||||||
@ -38,11 +38,11 @@
|
|||||||
@"caretButton": CaretButton.class,
|
@"caretButton": CaretButton.class,
|
||||||
@"textField" : MFTextField.class,
|
@"textField" : MFTextField.class,
|
||||||
@"digitTextField" : MFDigitTextField.class,
|
@"digitTextField" : MFDigitTextField.class,
|
||||||
@"checkbox" : MVMCoreUICheckBox.class,
|
@"checkbox" : Checkbox.class,
|
||||||
|
@"checkboxWithLabelView" : CheckboxWithLabelView.class,
|
||||||
@"cornerLabels" : CornerLabels.class,
|
@"cornerLabels" : CornerLabels.class,
|
||||||
@"progressBar": ProgressBar.class,
|
@"progressBar": ProgressBar.class,
|
||||||
@"multiProgressBar": MultiProgress.class,
|
@"multiProgressBar": MultiProgress.class,
|
||||||
@"checkbox": MVMCoreUICheckBox.class,
|
|
||||||
@"listItem": MoleculeTableViewCell.class,
|
@"listItem": MoleculeTableViewCell.class,
|
||||||
@"accordionListItem": AccordionMoleculeTableViewCell.class,
|
@"accordionListItem": AccordionMoleculeTableViewCell.class,
|
||||||
@"switch": MVMCoreUISwitch.class,
|
@"switch": MVMCoreUISwitch.class,
|
||||||
|
|||||||
@ -17,4 +17,6 @@
|
|||||||
/// Handle action
|
/// Handle action
|
||||||
- (void)didSelectCellAtIndex:(nonnull NSIndexPath *)indexPath delegateObject:(nullable MVMCoreUIDelegateObject *)delegateObject additionalData:(nullable NSDictionary *)additionalData;
|
- (void)didSelectCellAtIndex:(nonnull NSIndexPath *)indexPath delegateObject:(nullable MVMCoreUIDelegateObject *)delegateObject additionalData:(nullable NSDictionary *)additionalData;
|
||||||
|
|
||||||
|
- (void)willDisplay;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -56,9 +56,8 @@ open class MoleculeListTemplate: ThreeLayerTableViewController {
|
|||||||
// MARK: - table
|
// MARK: - table
|
||||||
open override func registerWithTable() {
|
open override func registerWithTable() {
|
||||||
super.registerWithTable()
|
super.registerWithTable()
|
||||||
guard let moleculesInfo = moleculesInfo else {
|
guard let moleculesInfo = moleculesInfo else { return }
|
||||||
return
|
|
||||||
}
|
|
||||||
for moleculeInfo in moleculesInfo {
|
for moleculeInfo in moleculesInfo {
|
||||||
tableView?.register(moleculeInfo.class, forCellReuseIdentifier: moleculeInfo.identifier)
|
tableView?.register(moleculeInfo.class, forCellReuseIdentifier: moleculeInfo.identifier)
|
||||||
}
|
}
|
||||||
@ -93,6 +92,13 @@ open class MoleculeListTemplate: ThreeLayerTableViewController {
|
|||||||
return cell
|
return cell
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
|
||||||
|
|
||||||
|
if let protocolCell = cell as? MoleculeListCellProtocol {
|
||||||
|
protocolCell.willDisplay?()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
open override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
open override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||||||
if let cell = tableView.cellForRow(at: indexPath) as? MoleculeListCellProtocol {
|
if let cell = tableView.cellForRow(at: indexPath) as? MoleculeListCellProtocol {
|
||||||
cell.didSelectCell?(atIndex: indexPath, delegateObject: delegateObject() as? MVMCoreUIDelegateObject, additionalData: nil)
|
cell.didSelectCell?(atIndex: indexPath, delegateObject: delegateObject() as? MVMCoreUIDelegateObject, additionalData: nil)
|
||||||
@ -125,9 +131,7 @@ open class MoleculeListTemplate: ThreeLayerTableViewController {
|
|||||||
open override func addMolecules(_ molecules: [[AnyHashable : Any]], sender: UITableViewCell, animation: UITableView.RowAnimation) {
|
open override func addMolecules(_ molecules: [[AnyHashable : Any]], sender: UITableViewCell, animation: UITableView.RowAnimation) {
|
||||||
// This dispatch is needed to fix a race condition that can occur if this function is called during the table setup.
|
// This dispatch is needed to fix a race condition that can occur if this function is called during the table setup.
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
guard let cell = sender as? MoleculeTableViewCell, let indexPath = self.tableView?.indexPath(for: cell) else {
|
guard let cell = sender as? MoleculeTableViewCell, let indexPath = self.tableView?.indexPath(for: cell) else { return }
|
||||||
return
|
|
||||||
}
|
|
||||||
var indexPaths: [IndexPath] = []
|
var indexPaths: [IndexPath] = []
|
||||||
for molecule in molecules {
|
for molecule in molecules {
|
||||||
if let info = self.getMoleculeInfo(with: molecule) {
|
if let info = self.getMoleculeInfo(with: molecule) {
|
||||||
|
|||||||
21
MVMCoreUI/Utility/CATransaction+Extension.swift
Normal file
21
MVMCoreUI/Utility/CATransaction+Extension.swift
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// CATransaction+Extension.swift
|
||||||
|
// MVMCoreUI
|
||||||
|
//
|
||||||
|
// Created by Kevin Christiano on 10/2/19.
|
||||||
|
// Copyright © 2019 Verizon Wireless. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
|
||||||
|
extension CATransaction {
|
||||||
|
|
||||||
|
/// Performs changes without activating animation actions.
|
||||||
|
static func withDisabledAnimations(_ actionBlock: ActionBlock) {
|
||||||
|
CATransaction.begin()
|
||||||
|
CATransaction.setDisableActions(true)
|
||||||
|
actionBlock()
|
||||||
|
CATransaction.commit()
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -198,13 +198,8 @@ static const CGFloat VertialShadowOffset = 6;
|
|||||||
[view.rightAnchor constraintEqualToAnchor:button.rightAnchor constant:PaddingTwo].active = YES;
|
[view.rightAnchor constraintEqualToAnchor:button.rightAnchor constant:PaddingTwo].active = YES;
|
||||||
[view.centerYAnchor constraintEqualToAnchor:button.centerYAnchor].active = YES;
|
[view.centerYAnchor constraintEqualToAnchor:button.centerYAnchor].active = YES;
|
||||||
} else {
|
} else {
|
||||||
if (@available(iOS 11.0, *)) {
|
[button.topAnchor constraintEqualToAnchor:view.safeAreaLayoutGuide.topAnchor constant:PaddingOne].active = YES;
|
||||||
[button.topAnchor constraintEqualToAnchor:view.safeAreaLayoutGuide.topAnchor constant:PaddingOne].active = YES;
|
[view.safeAreaLayoutGuide.trailingAnchor constraintEqualToAnchor:button.trailingAnchor constant:PaddingTwo].active = YES;
|
||||||
[view.safeAreaLayoutGuide.trailingAnchor constraintEqualToAnchor:button.trailingAnchor constant:PaddingTwo].active = YES;
|
|
||||||
} else {
|
|
||||||
[NSLayoutConstraint constraintPinSubview:button pinTop:YES topConstant:PaddingOne pinBottom:NO bottomConstant:0 pinLeft:NO leftConstant:0 pinRight:YES rightConstant:PaddingTwo];
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return button;
|
return button;
|
||||||
@ -249,16 +244,12 @@ static const CGFloat VertialShadowOffset = 6;
|
|||||||
}
|
}
|
||||||
|
|
||||||
+ (nullable UIView *)getAndSetupSafeAreaViewOnView:(nonnull UIView *)view {
|
+ (nullable UIView *)getAndSetupSafeAreaViewOnView:(nonnull UIView *)view {
|
||||||
if (@available(iOS 11.0, *)) {
|
UIView *safeAreaView = [MVMCoreUICommonViewsUtility commonView];
|
||||||
UIView *safeAreaView = [MVMCoreUICommonViewsUtility commonView];
|
[view addSubview:safeAreaView];
|
||||||
[view addSubview:safeAreaView];
|
[safeAreaView.topAnchor constraintEqualToAnchor:view.safeAreaLayoutGuide.bottomAnchor].active = YES;
|
||||||
[safeAreaView.topAnchor constraintEqualToAnchor:view.safeAreaLayoutGuide.bottomAnchor].active = YES;
|
[view.bottomAnchor constraintEqualToAnchor:safeAreaView.bottomAnchor].active = YES;
|
||||||
[view.bottomAnchor constraintEqualToAnchor:safeAreaView.bottomAnchor].active = YES;
|
[NSLayoutConstraint constraintPinSubview:safeAreaView pinTop:NO topConstant:0 pinBottom:NO bottomConstant:0 pinLeft:YES leftConstant:0 pinRight:YES rightConstant:0];
|
||||||
[NSLayoutConstraint constraintPinSubview:safeAreaView pinTop:NO topConstant:0 pinBottom:NO bottomConstant:0 pinLeft:YES leftConstant:0 pinRight:YES rightConstant:0];
|
return safeAreaView;
|
||||||
return safeAreaView;
|
|
||||||
} else {
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - shadows
|
#pragma mark - shadows
|
||||||
|
|||||||
@ -58,21 +58,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
+ (UIEdgeInsets)getMarginsForView:(nullable UIView *)view {
|
+ (UIEdgeInsets)getMarginsForView:(nullable UIView *)view {
|
||||||
if (@available(iOS 11.0, *)) {
|
return UIEdgeInsetsMake(view.directionalLayoutMargins.top, view.directionalLayoutMargins.leading, view.directionalLayoutMargins.bottom, view.directionalLayoutMargins.trailing);
|
||||||
return UIEdgeInsetsMake(view.directionalLayoutMargins.top, view.directionalLayoutMargins.leading, view.directionalLayoutMargins.bottom, view.directionalLayoutMargins.trailing);
|
|
||||||
} else {
|
|
||||||
return view.layoutMargins;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - Setters
|
#pragma mark - Setters
|
||||||
|
|
||||||
+ (void)setMarginsForView:(nullable UIView *)view leading:(CGFloat)leading top:(CGFloat)top trailing:(CGFloat)trailing bottom:(CGFloat)bottom {
|
+ (void)setMarginsForView:(nullable UIView *)view leading:(CGFloat)leading top:(CGFloat)top trailing:(CGFloat)trailing bottom:(CGFloat)bottom {
|
||||||
if (@available(iOS 11.0, *)) {
|
view.directionalLayoutMargins = NSDirectionalEdgeInsetsMake(top, leading, bottom, trailing);
|
||||||
view.directionalLayoutMargins = NSDirectionalEdgeInsetsMake(top, leading, bottom, trailing);
|
|
||||||
} else {
|
|
||||||
view.layoutMargins = UIEdgeInsetsMake(top, leading, bottom, trailing);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - Formatting
|
#pragma mark - Formatting
|
||||||
@ -152,12 +144,9 @@
|
|||||||
CGFloat topInset = scrollview.contentInset.top;
|
CGFloat topInset = scrollview.contentInset.top;
|
||||||
CGFloat bottomInset = scrollview.contentInset.bottom;
|
CGFloat bottomInset = scrollview.contentInset.bottom;
|
||||||
|
|
||||||
// Updates for ios 11
|
if (scrollview.contentInsetAdjustmentBehavior == UIScrollViewContentInsetAdjustmentAutomatic) {
|
||||||
if (@available(iOS 11.0, *)) {
|
topInset = scrollview.adjustedContentInset.top;
|
||||||
if (scrollview.contentInsetAdjustmentBehavior == UIScrollViewContentInsetAdjustmentAutomatic) {
|
bottomInset = scrollview.adjustedContentInset.bottom;
|
||||||
topInset = scrollview.adjustedContentInset.top;
|
|
||||||
bottomInset = scrollview.adjustedContentInset.bottom;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CGFloat remainingSpace = frameHeight - contentSizeHeight - topInset - bottomInset;
|
CGFloat remainingSpace = frameHeight - contentSizeHeight - topInset - bottomInset;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user