Merge branch 'develop' into feature/link

# Conflicts:
#	MVMCoreUI.xcodeproj/project.pbxproj
This commit is contained in:
Kevin G Christiano 2020-01-13 12:50:08 -05:00
commit 9882528b9e
52 changed files with 1007 additions and 551 deletions

View File

@ -20,12 +20,11 @@
0198F79F225679880066C936 /* FormValidationProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0198F79E225679870066C936 /* FormValidationProtocol.swift */; }; 0198F79F225679880066C936 /* FormValidationProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0198F79E225679870066C936 /* FormValidationProtocol.swift */; };
0198F7A62256A80B0066C936 /* MFRadioButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 0198F7A02256A80A0066C936 /* MFRadioButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0198F7A62256A80B0066C936 /* MFRadioButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 0198F7A02256A80A0066C936 /* MFRadioButton.h */; settings = {ATTRIBUTES = (Public, ); }; };
0198F7A82256A80B0066C936 /* MFRadioButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 0198F7A22256A80A0066C936 /* MFRadioButton.m */; }; 0198F7A82256A80B0066C936 /* MFRadioButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 0198F7A22256A80A0066C936 /* MFRadioButton.m */; };
01DF55E021F8FAA800CC099B /* MFTextFieldListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01DF55DF21F8FAA800CC099B /* MFTextFieldListView.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 */; }; 0A1B4A96233BB18F005B3FB4 /* CheckboxWithLabelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAFA2232BE63400FB8E22 /* CheckboxWithLabelView.swift */; };
0A41BA6E2344FCD400D4C0BC /* CATransaction+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */; }; 0A41BA6E2344FCD400D4C0BC /* CATransaction+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */; };
0A5D59C223AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */; };
0A7BAD74232A8DC700FB8E22 /* HeadlineBodyButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */; }; 0A7BAD74232A8DC700FB8E22 /* HeadlineBodyButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */; };
0A7BAFA1232BE61800FB8E22 /* Checkbox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAFA0232BE61800FB8E22 /* Checkbox.swift */; }; 0A7BAFA1232BE61800FB8E22 /* Checkbox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAFA0232BE61800FB8E22 /* Checkbox.swift */; };
943784F5236B77BB006A1E82 /* GraphView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 943784F3236B77BB006A1E82 /* GraphView.swift */; }; 943784F5236B77BB006A1E82 /* GraphView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 943784F3236B77BB006A1E82 /* GraphView.swift */; };
@ -33,6 +32,7 @@
9455B19C234F8A0400A574DB /* MVMAnimationFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */; }; 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 */; };
C07065C42395677300FBF997 /* Link.swift in Sources */ = {isa = PBXBuildFile; fileRef = C07065C32395677300FBF997 /* Link.swift */; }; C07065C42395677300FBF997 /* Link.swift in Sources */ = {isa = PBXBuildFile; fileRef = C07065C32395677300FBF997 /* Link.swift */; };
C7192E7D23C301750050C2A0 /* HeadLineBodyCaretLinkImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7192E7C23C301750050C2A0 /* HeadLineBodyCaretLinkImage.swift */; };
D20A9A5E2243D3E300ADE781 /* TwoButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */; }; D20A9A5E2243D3E300ADE781 /* TwoButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */; };
D213347723843825008E41B3 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = D213347623843825008E41B3 /* Line.swift */; }; D213347723843825008E41B3 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = D213347623843825008E41B3 /* Line.swift */; };
D224798A2314445E003FCCF9 /* LabelSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479892314445E003FCCF9 /* LabelSwitch.swift */; }; D224798A2314445E003FCCF9 /* LabelSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479892314445E003FCCF9 /* LabelSwitch.swift */; };
@ -48,9 +48,12 @@
D22D1F47220496A30077CEC0 /* MVMCoreUISwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = D22D1F45220496A30077CEC0 /* MVMCoreUISwitch.m */; }; D22D1F47220496A30077CEC0 /* MVMCoreUISwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = D22D1F45220496A30077CEC0 /* MVMCoreUISwitch.m */; };
D22D1F562204CE5D0077CEC0 /* MVMCoreUIStackableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D22D1F542204CE5D0077CEC0 /* MVMCoreUIStackableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; D22D1F562204CE5D0077CEC0 /* MVMCoreUIStackableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D22D1F542204CE5D0077CEC0 /* MVMCoreUIStackableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; };
D22D1F572204CE5D0077CEC0 /* MVMCoreUIStackableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D22D1F552204CE5D0077CEC0 /* MVMCoreUIStackableViewController.m */; }; D22D1F572204CE5D0077CEC0 /* MVMCoreUIStackableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D22D1F552204CE5D0077CEC0 /* MVMCoreUIStackableViewController.m */; };
D243859923A16B1800332775 /* Container.swift in Sources */ = {isa = PBXBuildFile; fileRef = D243859823A16B1800332775 /* Container.swift */; };
D260D7B122D65BDD007E7233 /* MVMCoreUIPageControl.h in Headers */ = {isa = PBXBuildFile; fileRef = D260D7AF22D65BDD007E7233 /* MVMCoreUIPageControl.h */; settings = {ATTRIBUTES = (Public, ); }; }; D260D7B122D65BDD007E7233 /* MVMCoreUIPageControl.h in Headers */ = {isa = PBXBuildFile; fileRef = D260D7AF22D65BDD007E7233 /* MVMCoreUIPageControl.h */; settings = {ATTRIBUTES = (Public, ); }; };
D260D7B222D65BDD007E7233 /* MVMCoreUIPageControl.m in Sources */ = {isa = PBXBuildFile; fileRef = D260D7B022D65BDD007E7233 /* MVMCoreUIPageControl.m */; }; D260D7B222D65BDD007E7233 /* MVMCoreUIPageControl.m in Sources */ = {isa = PBXBuildFile; fileRef = D260D7B022D65BDD007E7233 /* MVMCoreUIPageControl.m */; };
D260D7B622D68514007E7233 /* MVMCoreUIPagingProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D260D7B522D68509007E7233 /* MVMCoreUIPagingProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; D260D7B622D68514007E7233 /* MVMCoreUIPagingProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D260D7B522D68509007E7233 /* MVMCoreUIPagingProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
D268C70E238C22D7007F2C1C /* DropDownFilterTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D268C70D238C22D7007F2C1C /* DropDownFilterTableViewCell.swift */; };
D268C712238D6699007F2C1C /* DropDown.swift in Sources */ = {isa = PBXBuildFile; fileRef = D268C711238D6699007F2C1C /* DropDown.swift */; };
D274CA332236A78900B01B62 /* StandardFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D274CA322236A78900B01B62 /* StandardFooterView.swift */; }; D274CA332236A78900B01B62 /* StandardFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D274CA322236A78900B01B62 /* StandardFooterView.swift */; };
D2755D7B23689C7500485468 /* TableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2755D7A23689C7500485468 /* TableViewCell.swift */; }; D2755D7B23689C7500485468 /* TableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2755D7A23689C7500485468 /* TableViewCell.swift */; };
D27CD40E2322EEAF00C1DC07 /* TabsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D27CD40D2322EEAF00C1DC07 /* TabsTableViewCell.swift */; }; D27CD40E2322EEAF00C1DC07 /* TabsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D27CD40D2322EEAF00C1DC07 /* TabsTableViewCell.swift */; };
@ -196,6 +199,8 @@
D2E1FADB2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E1FADA2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift */; }; D2E1FADB2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E1FADA2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift */; };
D2E1FADF2268B8E700AEFD8C /* ThreeLayerTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E1FADE2268B8E700AEFD8C /* ThreeLayerTableViewController.swift */; }; D2E1FADF2268B8E700AEFD8C /* ThreeLayerTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E1FADE2268B8E700AEFD8C /* ThreeLayerTableViewController.swift */; };
D2E1FAE12268E81D00AEFD8C /* MoleculeListTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E1FAE02268E81D00AEFD8C /* MoleculeListTemplate.swift */; }; D2E1FAE12268E81D00AEFD8C /* MoleculeListTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E1FAE02268E81D00AEFD8C /* MoleculeListTemplate.swift */; };
D2FB151B23A2B65B00C20E10 /* MoleculeContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FB151A23A2B65B00C20E10 /* MoleculeContainer.swift */; };
D2FB151D23A40F1500C20E10 /* StackItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FB151C23A40F1500C20E10 /* StackItem.swift */; };
DB06250B2293456500B72DD3 /* LeftRightLabelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB06250A2293456500B72DD3 /* LeftRightLabelView.swift */; }; DB06250B2293456500B72DD3 /* LeftRightLabelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB06250A2293456500B72DD3 /* LeftRightLabelView.swift */; };
DBC4391822442197001AB423 /* CaretView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBC4391622442196001AB423 /* CaretView.swift */; }; DBC4391822442197001AB423 /* CaretView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBC4391622442196001AB423 /* CaretView.swift */; };
DBC4391922442197001AB423 /* DashLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBC4391722442197001AB423 /* DashLine.swift */; }; DBC4391922442197001AB423 /* DashLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBC4391722442197001AB423 /* DashLine.swift */; };
@ -218,10 +223,9 @@
0198F79E225679870066C936 /* FormValidationProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FormValidationProtocol.swift; sourceTree = "<group>"; }; 0198F79E225679870066C936 /* FormValidationProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FormValidationProtocol.swift; sourceTree = "<group>"; };
0198F7A02256A80A0066C936 /* MFRadioButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFRadioButton.h; sourceTree = "<group>"; }; 0198F7A02256A80A0066C936 /* MFRadioButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MFRadioButton.h; sourceTree = "<group>"; };
0198F7A22256A80A0066C936 /* MFRadioButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFRadioButton.m; sourceTree = "<group>"; }; 0198F7A22256A80A0066C936 /* MFRadioButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MFRadioButton.m; 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>"; };
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>"; }; 0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CATransaction+Extension.swift"; sourceTree = "<group>"; };
0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleGuidelinesProtocol.swift; sourceTree = "<group>"; };
0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyButton.swift; sourceTree = "<group>"; }; 0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodyButton.swift; sourceTree = "<group>"; };
0A7BAFA0232BE61800FB8E22 /* Checkbox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Checkbox.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>"; }; 0A7BAFA2232BE63400FB8E22 /* CheckboxWithLabelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckboxWithLabelView.swift; sourceTree = "<group>"; };
@ -230,6 +234,7 @@
9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MVMAnimationFramework.framework; path = ../SharedFrameworks/MVMAnimationFramework.framework; 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>"; };
C07065C32395677300FBF997 /* Link.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Link.swift; sourceTree = "<group>"; }; C07065C32395677300FBF997 /* Link.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Link.swift; sourceTree = "<group>"; };
C7192E7C23C301750050C2A0 /* HeadLineBodyCaretLinkImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadLineBodyCaretLinkImage.swift; sourceTree = "<group>"; };
D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwoButtonView.swift; sourceTree = "<group>"; }; D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwoButtonView.swift; sourceTree = "<group>"; };
D213347623843825008E41B3 /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = "<group>"; }; D213347623843825008E41B3 /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = "<group>"; };
D22479892314445E003FCCF9 /* LabelSwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelSwitch.swift; sourceTree = "<group>"; }; D22479892314445E003FCCF9 /* LabelSwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelSwitch.swift; sourceTree = "<group>"; };
@ -245,9 +250,12 @@
D22D1F45220496A30077CEC0 /* MVMCoreUISwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUISwitch.m; sourceTree = "<group>"; }; D22D1F45220496A30077CEC0 /* MVMCoreUISwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUISwitch.m; sourceTree = "<group>"; };
D22D1F542204CE5D0077CEC0 /* MVMCoreUIStackableViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIStackableViewController.h; sourceTree = "<group>"; }; D22D1F542204CE5D0077CEC0 /* MVMCoreUIStackableViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIStackableViewController.h; sourceTree = "<group>"; };
D22D1F552204CE5D0077CEC0 /* MVMCoreUIStackableViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIStackableViewController.m; sourceTree = "<group>"; }; D22D1F552204CE5D0077CEC0 /* MVMCoreUIStackableViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIStackableViewController.m; sourceTree = "<group>"; };
D243859823A16B1800332775 /* Container.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Container.swift; sourceTree = "<group>"; };
D260D7AF22D65BDD007E7233 /* MVMCoreUIPageControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIPageControl.h; sourceTree = "<group>"; }; D260D7AF22D65BDD007E7233 /* MVMCoreUIPageControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIPageControl.h; sourceTree = "<group>"; };
D260D7B022D65BDD007E7233 /* MVMCoreUIPageControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIPageControl.m; sourceTree = "<group>"; }; D260D7B022D65BDD007E7233 /* MVMCoreUIPageControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIPageControl.m; sourceTree = "<group>"; };
D260D7B522D68509007E7233 /* MVMCoreUIPagingProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIPagingProtocol.h; sourceTree = "<group>"; }; D260D7B522D68509007E7233 /* MVMCoreUIPagingProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIPagingProtocol.h; sourceTree = "<group>"; };
D268C70D238C22D7007F2C1C /* DropDownFilterTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DropDownFilterTableViewCell.swift; sourceTree = "<group>"; };
D268C711238D6699007F2C1C /* DropDown.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DropDown.swift; sourceTree = "<group>"; };
D274CA322236A78900B01B62 /* StandardFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandardFooterView.swift; sourceTree = "<group>"; }; D274CA322236A78900B01B62 /* StandardFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandardFooterView.swift; sourceTree = "<group>"; };
D2755D7A23689C7500485468 /* TableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewCell.swift; sourceTree = "<group>"; }; D2755D7A23689C7500485468 /* TableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewCell.swift; sourceTree = "<group>"; };
D27CD40D2322EEAF00C1DC07 /* TabsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabsTableViewCell.swift; sourceTree = "<group>"; }; D27CD40D2322EEAF00C1DC07 /* TabsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabsTableViewCell.swift; sourceTree = "<group>"; };
@ -398,6 +406,8 @@
D2E1FADE2268B8E700AEFD8C /* ThreeLayerTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreeLayerTableViewController.swift; sourceTree = "<group>"; }; D2E1FADE2268B8E700AEFD8C /* ThreeLayerTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreeLayerTableViewController.swift; sourceTree = "<group>"; };
D2E1FAE02268E81D00AEFD8C /* MoleculeListTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeListTemplate.swift; sourceTree = "<group>"; }; D2E1FAE02268E81D00AEFD8C /* MoleculeListTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeListTemplate.swift; sourceTree = "<group>"; };
D2F4DDE52371A4CB00CD28BB /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; }; D2F4DDE52371A4CB00CD28BB /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
D2FB151A23A2B65B00C20E10 /* MoleculeContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeContainer.swift; sourceTree = "<group>"; };
D2FB151C23A40F1500C20E10 /* StackItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackItem.swift; sourceTree = "<group>"; };
DB06250A2293456500B72DD3 /* LeftRightLabelView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LeftRightLabelView.swift; sourceTree = "<group>"; }; DB06250A2293456500B72DD3 /* LeftRightLabelView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LeftRightLabelView.swift; sourceTree = "<group>"; };
DB891E822253FA8500022516 /* Label.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = "<group>"; }; DB891E822253FA8500022516 /* Label.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = "<group>"; };
DBC4391622442196001AB423 /* CaretView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CaretView.swift; sourceTree = "<group>"; }; DBC4391622442196001AB423 /* CaretView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CaretView.swift; sourceTree = "<group>"; };
@ -430,6 +440,14 @@
path = FormUIHelpers; path = FormUIHelpers;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
0A5D59C323AD488600EFD9E9 /* Protocols */ = {
isa = PBXGroup;
children = (
0A5D59C123AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift */,
);
path = Protocols;
sourceTree = "<group>";
};
D213347423842FE3008E41B3 /* Controllers */ = { D213347423842FE3008E41B3 /* Controllers */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -452,6 +470,12 @@
D29DF31F21ED0CBA003B2FB9 /* LabelView.m */, D29DF31F21ED0CBA003B2FB9 /* LabelView.m */,
D29DF15921E697DA003B2FB9 /* SeparatorView.h */, D29DF15921E697DA003B2FB9 /* SeparatorView.h */,
D29DF15A21E697DA003B2FB9 /* SeparatorView.m */, D29DF15A21E697DA003B2FB9 /* SeparatorView.m */,
D22D1F1C220343560077CEC0 /* MVMCoreUICheckMarkView.h */,
D22D1F1D220343560077CEC0 /* MVMCoreUICheckMarkView.m */,
D22D1F18220341F50077CEC0 /* MVMCoreUICheckBox.h */,
D22D1F19220341F50077CEC0 /* MVMCoreUICheckBox.m */,
0198F7A02256A80A0066C936 /* MFRadioButton.h */,
0198F7A22256A80A0066C936 /* MFRadioButton.m */,
); );
path = Views; path = Views;
sourceTree = "<group>"; sourceTree = "<group>";
@ -472,6 +496,7 @@
D2A638FC22CA98280052ED1F /* HeadlineBody.swift */, D2A638FC22CA98280052ED1F /* HeadlineBody.swift */,
D22479952316AF6D003FCCF9 /* HeadlineBodyTextButton.swift */, D22479952316AF6D003FCCF9 /* HeadlineBodyTextButton.swift */,
D27CD40F2339057800C1DC07 /* EyebrowHeadlineBodyLink.swift */, D27CD40F2339057800C1DC07 /* EyebrowHeadlineBodyLink.swift */,
C7192E7C23C301750050C2A0 /* HeadLineBodyCaretLinkImage.swift */,
); );
path = VerticalCombinationViews; path = VerticalCombinationViews;
sourceTree = "<group>"; sourceTree = "<group>";
@ -511,6 +536,8 @@
D2A6390422CBCE160052ED1F /* MoleculeCollectionViewCell.swift */, D2A6390422CBCE160052ED1F /* MoleculeCollectionViewCell.swift */,
D224799A231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift */, D224799A231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift */,
D27CD40D2322EEAF00C1DC07 /* TabsTableViewCell.swift */, D27CD40D2322EEAF00C1DC07 /* TabsTableViewCell.swift */,
D268C70D238C22D7007F2C1C /* DropDownFilterTableViewCell.swift */,
D2FB151C23A40F1500C20E10 /* StackItem.swift */,
); );
path = Items; path = Items;
sourceTree = "<group>"; sourceTree = "<group>";
@ -568,7 +595,6 @@
D29DF0DF21E418B2003B2FB9 /* Templates */ = { D29DF0DF21E418B2003B2FB9 /* Templates */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
01DF566F21FA5AB300CC099B /* TextFieldListFormViewController.swift */,
D2A5146022121FBF00345BFB /* MoleculeStackTemplate.swift */, D2A5146022121FBF00345BFB /* MoleculeStackTemplate.swift */,
D2A514622213643100345BFB /* MoleculeStackCenteredTemplate.swift */, D2A514622213643100345BFB /* MoleculeStackCenteredTemplate.swift */,
D296E13B2295969C0051EBE7 /* MoleculeListCellProtocol.h */, D296E13B2295969C0051EBE7 /* MoleculeListCellProtocol.h */,
@ -606,7 +632,6 @@
D224798D2316A988003FCCF9 /* VerticalCombinationViews */, D224798D2316A988003FCCF9 /* VerticalCombinationViews */,
D2A5145C2211D22A00345BFB /* MVMCoreUIMoleculeViewProtocol.h */, D2A5145C2211D22A00345BFB /* MVMCoreUIMoleculeViewProtocol.h */,
0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */, 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */,
01DF55DF21F8FAA800CC099B /* MFTextFieldListView.swift */,
D29770C721F7C4AE00B2F0D0 /* TopLabelsView.h */, D29770C721F7C4AE00B2F0D0 /* TopLabelsView.h */,
D29770C621F7C4AE00B2F0D0 /* TopLabelsView.m */, D29770C621F7C4AE00B2F0D0 /* TopLabelsView.m */,
D2A514662213885800345BFB /* StandardHeaderView.swift */, D2A514662213885800345BFB /* StandardHeaderView.swift */,
@ -616,6 +641,7 @@
D2D6CD3F22E78C1A00D701B8 /* Scroller.swift */, D2D6CD3F22E78C1A00D701B8 /* Scroller.swift */,
0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */, 0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */,
017BEB372360C6AC0024EF95 /* RadioButtonLabel.swift */, 017BEB372360C6AC0024EF95 /* RadioButtonLabel.swift */,
D2FB151A23A2B65B00C20E10 /* MoleculeContainer.swift */,
); );
path = Molecules; path = Molecules;
sourceTree = "<group>"; sourceTree = "<group>";
@ -660,6 +686,7 @@
D29DF2B721E7BE79003B2FB9 /* TabBarController */, D29DF2B721E7BE79003B2FB9 /* TabBarController */,
D29DF2B621E7BE66003B2FB9 /* SplitViewController */, D29DF2B621E7BE66003B2FB9 /* SplitViewController */,
D2B18B93236214AD00A9AEDC /* NavigationController.swift */, D2B18B93236214AD00A9AEDC /* NavigationController.swift */,
D243859823A16B1800332775 /* Container.swift */,
); );
path = Containers; path = Containers;
sourceTree = "<group>"; sourceTree = "<group>";
@ -755,22 +782,17 @@
D29DF2AD21E7B3A4003B2FB9 /* MFTextView.h */, D29DF2AD21E7B3A4003B2FB9 /* MFTextView.h */,
D29DF2AB21E7B3A4003B2FB9 /* MFTextView.m */, D29DF2AB21E7B3A4003B2FB9 /* MFTextView.m */,
D29DF2AC21E7B3A4003B2FB9 /* MFTextView.xib */, D29DF2AC21E7B3A4003B2FB9 /* MFTextView.xib */,
D268C711238D6699007F2C1C /* DropDown.swift */,
D29DF2B121E7B76C003B2FB9 /* MFLoadingSpinner.h */, D29DF2B121E7B76C003B2FB9 /* MFLoadingSpinner.h */,
D29DF2B221E7B76D003B2FB9 /* MFLoadingSpinner.m */, D29DF2B221E7B76D003B2FB9 /* MFLoadingSpinner.m */,
D29DF32321ED0DA2003B2FB9 /* TextButtonView.h */, D29DF32321ED0DA2003B2FB9 /* TextButtonView.h */,
D29DF32221ED0DA2003B2FB9 /* TextButtonView.m */, D29DF32221ED0DA2003B2FB9 /* TextButtonView.m */,
D29770FB21F7C77400B2F0D0 /* MVMCoreUITextFieldView.h */, D29770FB21F7C77400B2F0D0 /* MVMCoreUITextFieldView.h */,
D29770FA21F7C77400B2F0D0 /* MVMCoreUITextFieldView.m */, D29770FA21F7C77400B2F0D0 /* MVMCoreUITextFieldView.m */,
D22D1F1C220343560077CEC0 /* MVMCoreUICheckMarkView.h */,
D22D1F1D220343560077CEC0 /* MVMCoreUICheckMarkView.m */,
D22D1F18220341F50077CEC0 /* MVMCoreUICheckBox.h */,
D22D1F19220341F50077CEC0 /* MVMCoreUICheckBox.m */,
D22D1F44220496A30077CEC0 /* MVMCoreUISwitch.h */, D22D1F44220496A30077CEC0 /* MVMCoreUISwitch.h */,
D22D1F45220496A30077CEC0 /* MVMCoreUISwitch.m */, D22D1F45220496A30077CEC0 /* MVMCoreUISwitch.m */,
DBC4391C2245232D001AB423 /* LabelWithInternalButton.swift */, DBC4391C2245232D001AB423 /* LabelWithInternalButton.swift */,
DB891E822253FA8500022516 /* Label.swift */, DB891E822253FA8500022516 /* Label.swift */,
0198F7A02256A80A0066C936 /* MFRadioButton.h */,
0198F7A22256A80A0066C936 /* MFRadioButton.m */,
0A7BAFA0232BE61800FB8E22 /* Checkbox.swift */, 0A7BAFA0232BE61800FB8E22 /* Checkbox.swift */,
0A7BAFA2232BE63400FB8E22 /* CheckboxWithLabelView.swift */, 0A7BAFA2232BE63400FB8E22 /* CheckboxWithLabelView.swift */,
01004F2F22721C3800991ECC /* RadioButton.swift */, 01004F2F22721C3800991ECC /* RadioButton.swift */,
@ -898,6 +920,7 @@
children = ( children = (
D2B18B7E2360913400A9AEDC /* Control.swift */, D2B18B7E2360913400A9AEDC /* Control.swift */,
D2B18B802360945C00A9AEDC /* View.swift */, D2B18B802360945C00A9AEDC /* View.swift */,
0A5D59C323AD488600EFD9E9 /* Protocols */,
); );
path = BaseClasses; path = BaseClasses;
sourceTree = "<group>"; sourceTree = "<group>";
@ -1060,6 +1083,7 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
0A5D59C223AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift in Sources */,
943784F5236B77BB006A1E82 /* GraphView.swift in Sources */, 943784F5236B77BB006A1E82 /* GraphView.swift in Sources */,
D29DF32121ED0CBA003B2FB9 /* LabelView.m in Sources */, D29DF32121ED0CBA003B2FB9 /* LabelView.m in Sources */,
DBC4391822442197001AB423 /* CaretView.swift in Sources */, DBC4391822442197001AB423 /* CaretView.swift in Sources */,
@ -1068,6 +1092,7 @@
D29B771022C281F400D6ACE0 /* ModuleMolecule.swift in Sources */, D29B771022C281F400D6ACE0 /* ModuleMolecule.swift in Sources */,
DBC4391922442197001AB423 /* DashLine.swift in Sources */, DBC4391922442197001AB423 /* DashLine.swift in Sources */,
0A7BAD74232A8DC700FB8E22 /* HeadlineBodyButton.swift in Sources */, 0A7BAD74232A8DC700FB8E22 /* HeadlineBodyButton.swift in Sources */,
D2FB151D23A40F1500C20E10 /* StackItem.swift in Sources */,
D29DF29621E7ADB8003B2FB9 /* StackableViewController.m in Sources */, D29DF29621E7ADB8003B2FB9 /* StackableViewController.m in Sources */,
0116A4E5228B19640094F3ED /* RadioButtonModel.swift in Sources */, 0116A4E5228B19640094F3ED /* RadioButtonModel.swift in Sources */,
D2E1FADB2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift in Sources */, D2E1FADB2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift in Sources */,
@ -1075,6 +1100,7 @@
D224799B231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift in Sources */, D224799B231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift in Sources */,
D22D1F1F220343560077CEC0 /* MVMCoreUICheckMarkView.m in Sources */, D22D1F1F220343560077CEC0 /* MVMCoreUICheckMarkView.m in Sources */,
01004F3022721C3800991ECC /* RadioButton.swift in Sources */, 01004F3022721C3800991ECC /* RadioButton.swift in Sources */,
D268C70E238C22D7007F2C1C /* DropDownFilterTableViewCell.swift in Sources */,
D282AAB4223FDDAE00C46919 /* MFLoadImageView.swift in Sources */, D282AAB4223FDDAE00C46919 /* MFLoadImageView.swift in Sources */,
D29DF11721E6805F003B2FB9 /* UIColor+MFConvenience.m in Sources */, D29DF11721E6805F003B2FB9 /* UIColor+MFConvenience.m in Sources */,
D29DF25321E6A177003B2FB9 /* MFDigitTextField.m in Sources */, D29DF25321E6A177003B2FB9 /* MFDigitTextField.m in Sources */,
@ -1089,7 +1115,6 @@
D29DF12E21E6851E003B2FB9 /* MVMCoreUITopAlertView.m in Sources */, D29DF12E21E6851E003B2FB9 /* MVMCoreUITopAlertView.m in Sources */,
D29DF2CF21E7C104003B2FB9 /* MFLoadingViewController.m in Sources */, D29DF2CF21E7C104003B2FB9 /* MFLoadingViewController.m in Sources */,
D22D1F572204CE5D0077CEC0 /* MVMCoreUIStackableViewController.m in Sources */, D22D1F572204CE5D0077CEC0 /* MVMCoreUIStackableViewController.m in Sources */,
01DF567021FA5AB300CC099B /* TextFieldListFormViewController.swift in Sources */,
D2A5145F2211DDC100345BFB /* MoleculeStackView.swift in Sources */, D2A5145F2211DDC100345BFB /* MoleculeStackView.swift in Sources */,
D29DF27621E79E81003B2FB9 /* MVMCoreUILoggingHandler.m in Sources */, D29DF27621E79E81003B2FB9 /* MVMCoreUILoggingHandler.m in Sources */,
D29DF24D21E6A177003B2FB9 /* MFTextField.m in Sources */, D29DF24D21E6A177003B2FB9 /* MFTextField.m in Sources */,
@ -1125,13 +1150,13 @@
D29DF2BF21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.m in Sources */, D29DF2BF21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.m in Sources */,
D29DF28321E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.m in Sources */, D29DF28321E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.m in Sources */,
D29DF27A21E7A533003B2FB9 /* MVMCoreUISession.m in Sources */, D29DF27A21E7A533003B2FB9 /* MVMCoreUISession.m in Sources */,
01DF55E021F8FAA800CC099B /* MFTextFieldListView.swift in Sources */,
D2A5146B2214905000345BFB /* ThreeLayerViewController.swift in Sources */, D2A5146B2214905000345BFB /* ThreeLayerViewController.swift in Sources */,
D29DF2C921E7BFC6003B2FB9 /* MFSizeObject.m in Sources */, D29DF2C921E7BFC6003B2FB9 /* MFSizeObject.m in Sources */,
D2A6390522CBCE160052ED1F /* MoleculeCollectionViewCell.swift in Sources */, D2A6390522CBCE160052ED1F /* MoleculeCollectionViewCell.swift in Sources */,
D2A6390122CBB1820052ED1F /* Carousel.swift in Sources */, D2A6390122CBB1820052ED1F /* Carousel.swift in Sources */,
D29DF2C721E7BF57003B2FB9 /* MFTabBarInteractor.m in Sources */, D29DF2C721E7BF57003B2FB9 /* MFTabBarInteractor.m in Sources */,
D29DF29521E7ADB8003B2FB9 /* ProgrammaticScrollViewController.m in Sources */, D29DF29521E7ADB8003B2FB9 /* ProgrammaticScrollViewController.m in Sources */,
D2FB151B23A2B65B00C20E10 /* MoleculeContainer.swift in Sources */,
D2A638FD22CA98280052ED1F /* HeadlineBody.swift in Sources */, D2A638FD22CA98280052ED1F /* HeadlineBody.swift in Sources */,
D29DF16121E69996003B2FB9 /* MFViewController.m in Sources */, D29DF16121E69996003B2FB9 /* MFViewController.m in Sources */,
D2E1FAE12268E81D00AEFD8C /* MoleculeListTemplate.swift in Sources */, D2E1FAE12268E81D00AEFD8C /* MoleculeListTemplate.swift in Sources */,
@ -1143,6 +1168,7 @@
D27CD4102339057800C1DC07 /* EyebrowHeadlineBodyLink.swift in Sources */, D27CD4102339057800C1DC07 /* EyebrowHeadlineBodyLink.swift in Sources */,
D29DF11D21E684A9003B2FB9 /* MVMCoreUISplitViewController.m in Sources */, D29DF11D21E684A9003B2FB9 /* MVMCoreUISplitViewController.m in Sources */,
0198F79F225679880066C936 /* FormValidationProtocol.swift in Sources */, 0198F79F225679880066C936 /* FormValidationProtocol.swift in Sources */,
D243859923A16B1800332775 /* Container.swift in Sources */,
D29DF29821E7ADB8003B2FB9 /* MFScrollingViewController.m in Sources */, D29DF29821E7ADB8003B2FB9 /* MFScrollingViewController.m in Sources */,
D29770C821F7C4AE00B2F0D0 /* TopLabelsView.m in Sources */, D29770C821F7C4AE00B2F0D0 /* TopLabelsView.m in Sources */,
D2E1FADF2268B8E700AEFD8C /* ThreeLayerTableViewController.swift in Sources */, D2E1FADF2268B8E700AEFD8C /* ThreeLayerTableViewController.swift in Sources */,
@ -1158,7 +1184,9 @@
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 */,
D268C712238D6699007F2C1C /* DropDown.swift in Sources */,
0A41BA6E2344FCD400D4C0BC /* CATransaction+Extension.swift in Sources */, 0A41BA6E2344FCD400D4C0BC /* CATransaction+Extension.swift in Sources */,
C7192E7D23C301750050C2A0 /* HeadLineBodyCaretLinkImage.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 */,

View File

@ -136,7 +136,7 @@ open class CaretButton: MFCustomButton, MVMCoreUIMoleculeViewProtocol, MVMCoreUI
return true return true
} }
open func alignment() -> UIStackView.Alignment { open func horizontalAlignment() -> UIStackView.Alignment {
return UIStackView.Alignment.leading; return UIStackView.Alignment.leading;
} }

View File

@ -9,10 +9,17 @@
import UIKit import UIKit
@objcMembers open class Link: MFCustomButton { @objcMembers open class Link: MFCustomButton {
//--------------------------------------------------
// MARK: - Properties
//--------------------------------------------------
private var additionalData: [AnyHashable: Any]? private var additionalData: [AnyHashable: Any]?
private var delegateObject: MVMCoreUIDelegateObject? private var delegateObject: MVMCoreUIDelegateObject?
//--------------------------------------------------
// MARK: - Initializers
//--------------------------------------------------
public override init(frame: CGRect) { public override init(frame: CGRect) {
super.init(frame: frame) super.init(frame: frame)
setupView() setupView()
@ -23,6 +30,10 @@ import UIKit
setupView() setupView()
} }
//--------------------------------------------------
// MARK: - Lifecycle
//--------------------------------------------------
open override func draw(_ rect: CGRect) { open override func draw(_ rect: CGRect) {
guard let textRect = titleLabel?.frame else { return } guard let textRect = titleLabel?.frame else { return }
@ -44,6 +55,10 @@ import UIKit
contextRef?.drawPath(using: .stroke) contextRef?.drawPath(using: .stroke)
} }
//--------------------------------------------------
// MARK: - UITouch
//--------------------------------------------------
override open func point(inside point: CGPoint, with event: UIEvent?) -> Bool { override open func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
let faultTolerance: CGFloat = 20.0 let faultTolerance: CGFloat = 20.0
@ -56,6 +71,7 @@ import UIKit
} }
} }
// MARK: - MVMCoreViewProtocol
extension Link: MVMCoreViewProtocol { extension Link: MVMCoreViewProtocol {
public func updateView(_ size: CGFloat) { public func updateView(_ size: CGFloat) {

View File

@ -156,7 +156,7 @@
return YES; return YES;
} }
- (UIStackViewAlignment)alignment { - (UIStackViewAlignment)horizontalAlignment {
return UIStackViewAlignmentLeading; return UIStackViewAlignmentLeading;
} }

View File

@ -664,6 +664,8 @@
} }
- (void)setAsMolecule { - (void)setAsMolecule {
self.translatesAutoresizingMaskIntoConstraints = false;
[self pinHeight];
[self setAsStandardCustom]; [self setAsStandardCustom];
} }
@ -713,6 +715,10 @@
[self setWithActionMap:json delegateObject:delegateObject additionalData:additionalData]; [self setWithActionMap:json delegateObject:delegateObject additionalData:additionalData];
} }
- (UIStackViewAlignment)horizontalAlignment {
return UIStackViewAlignmentCenter;
}
#pragma mark - Handling Validations #pragma mark - Handling Validations
- (void)setEnabledByValidity { - (void)setEnabledByValidity {

View File

@ -74,6 +74,7 @@
//default error message //default error message
@property (nullable, strong, nonatomic) NSString *errMessage; @property (nullable, strong, nonatomic) NSString *errMessage;
@property (nullable, strong, nonatomic) IBOutlet NSLayoutConstraint *errorHeightConstraint;
@property (nullable, copy, nonatomic) void (^editCompleteAction)(NSString * _Nullable text); @property (nullable, copy, nonatomic) void (^editCompleteAction)(NSString * _Nullable text);

View File

@ -558,6 +558,7 @@
#pragma mark - MVMCoreUIMoleculeViewProtocol #pragma mark - MVMCoreUIMoleculeViewProtocol
- (void)setWithJSON:(NSDictionary *)json delegateObject:(MVMCoreUIDelegateObject *)delegateObject additionalData:(NSDictionary *)additionalData { - (void)setWithJSON:(NSDictionary *)json delegateObject:(MVMCoreUIDelegateObject *)delegateObject additionalData:(NSDictionary *)additionalData {
[super setWithJSON:json delegateObject:delegateObject additionalData:additionalData];
if ([delegateObject isKindOfClass:[MVMCoreUIDelegateObject class]]) { if ([delegateObject isKindOfClass:[MVMCoreUIDelegateObject class]]) {
[FormValidator setupValidationWithMolecule:self delegate:delegateObject.formValidationProtocol]; [FormValidator setupValidationWithMolecule:self delegate:delegateObject.formValidationProtocol];
FormValidator *formValidator = [FormValidator getFormValidatorForDelegate:delegateObject.formValidationProtocol]; FormValidator *formValidator = [FormValidator getFormValidatorForDelegate:delegateObject.formValidationProtocol];

View File

@ -1,11 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait"> <device id="retina4_7" orientation="portrait" appearance="light"/>
<adaptation id="fullscreen"/>
</device>
<dependencies> <dependencies>
<deployment identifier="iOS"/> <deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15510"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<objects> <objects>
@ -15,6 +13,7 @@
<outlet property="dashLine" destination="hw1-Eo-Szn" id="WCs-FF-LCg"/> <outlet property="dashLine" destination="hw1-Eo-Szn" id="WCs-FF-LCg"/>
<outlet property="dropDownCarrotLabel" destination="XuL-hz-X9C" id="Kv1-Pd-Kra"/> <outlet property="dropDownCarrotLabel" destination="XuL-hz-X9C" id="Kv1-Pd-Kra"/>
<outlet property="dropDownCarrotWidth" destination="DJA-00-1ne" id="SHb-1H-EZD"/> <outlet property="dropDownCarrotWidth" destination="DJA-00-1ne" id="SHb-1H-EZD"/>
<outlet property="errorHeightConstraint" destination="r34-xP-jcf" id="jno-7u-oKU"/>
<outlet property="errorLableLeftPin" destination="8pf-sH-2Ct" id="nhS-H8-RKZ"/> <outlet property="errorLableLeftPin" destination="8pf-sH-2Ct" id="nhS-H8-RKZ"/>
<outlet property="errorLableRightPin" destination="I5y-Go-vVq" id="TN8-Bi-GEP"/> <outlet property="errorLableRightPin" destination="I5y-Go-vVq" id="TN8-Bi-GEP"/>
<outlet property="formLabel" destination="8zH-YN-qag" id="him-Et-eoN"/> <outlet property="formLabel" destination="8zH-YN-qag" id="him-Et-eoN"/>

View File

@ -131,7 +131,7 @@ extension CaretView: MVMCoreUIViewConstrainingProtocol {
return true return true
} }
open func alignment() -> UIStackView.Alignment { open func horizontalAlignment() -> UIStackView.Alignment {
return UIStackView.Alignment.leading; return UIStackView.Alignment.leading;
} }
} }

View File

@ -11,11 +11,13 @@ import MVMCore
/** /**
This class expects its height and width to be equal. This class expects its height and width to be equal.
*/ */
@objcMembers open class Checkbox: UIControl, MVMCoreViewProtocol, MVMCoreUIMoleculeViewProtocol, MVMCoreUIViewConstrainingProtocol { @objcMembers open class Checkbox: Control, MVMCoreUIViewConstrainingProtocol {
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Properties // MARK: - Properties
//-------------------------------------------------- //--------------------------------------------------
public var sizeObject: MFSizeObject? = MFSizeObject(standardSize: Checkbox.defaultHeightWidth, standardiPadPortraitSize: Checkbox.defaultHeightWidth + 6.0)
// Form Validation // Form Validation
var isRequired = false var isRequired = false
var fieldKey: String? var fieldKey: String?
@ -117,8 +119,8 @@ import MVMCore
// MARK: - Constraints // MARK: - Constraints
//-------------------------------------------------- //--------------------------------------------------
private var heightConstraint: NSLayoutConstraint? public var heightConstraint: NSLayoutConstraint?
private var widthConstraint: NSLayoutConstraint? public var widthConstraint: NSLayoutConstraint?
/// Updates the height and width anchors of the Checkbox with the assigned value. /// Updates the height and width anchors of the Checkbox with the assigned value.
public var heigthWidthConstant: CGFloat = Checkbox.defaultHeightWidth { public var heigthWidthConstant: CGFloat = Checkbox.defaultHeightWidth {
@ -138,7 +140,6 @@ import MVMCore
accessibilityTraits = .button accessibilityTraits = .button
accessibilityHint = MVMCoreUIUtility.hardcodedString(withKey: "checkbox_action_hint") accessibilityHint = MVMCoreUIUtility.hardcodedString(withKey: "checkbox_action_hint")
updateAccessibilityLabel() updateAccessibilityLabel()
setupView()
} }
/// There is currently no intention on using xib files. /// There is currently no intention on using xib files.
@ -147,7 +148,7 @@ import MVMCore
fatalError("xib file is not implemented for Checkbox.") fatalError("xib file is not implemented for Checkbox.")
} }
public convenience init() { public convenience override init() {
self.init(frame:.zero) self.init(frame:.zero)
} }
@ -180,7 +181,8 @@ import MVMCore
layer.borderColor = borderColor.cgColor layer.borderColor = borderColor.cgColor
} }
open func setupView() { open override func setupView() {
super.setupView()
guard constraints.isEmpty else { return } guard constraints.isEmpty else { return }
@ -349,18 +351,7 @@ import MVMCore
open override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { open override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
sendActions(for: touchIsAcceptablyOutside(touches.first) ? .touchUpOutside : .touchUpInside) sendActions(for: .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 { override open func accessibilityActivate() -> Bool {
@ -376,7 +367,8 @@ import MVMCore
return true return true
} }
open func reset() { open override func reset() {
super.reset()
isEnabled(true) isEnabled(true)
shapeLayer?.removeAllAnimations() shapeLayer?.removeAllAnimations()
@ -396,17 +388,24 @@ import MVMCore
setupView() setupView()
} }
public func updateView(_ size: CGFloat) { public override func updateView(_ size: CGFloat) {
super.updateView(size)
if let dimension = sizeObject?.getValueBased(onSize: size) {
widthConstraint?.constant = dimension
heightConstraint?.constant = dimension
}
layoutIfNeeded() layoutIfNeeded()
} }
public func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { public override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
self.delegateObject = delegateObject self.delegateObject = delegateObject
FormValidator.setupValidation(molecule: self, delegate: delegateObject?.formValidationProtocol) FormValidator.setupValidation(molecule: self, delegate: delegateObject?.formValidationProtocol)
guard let dictionary = json else { return } guard let dictionary = json else { return }
groupName = dictionary.optionalStringForKey("groupName") groupName = dictionary.optionalStringForKey("groupName")
fieldValue = dictionary.optionalStringForKey("value") fieldValue = dictionary.optionalStringForKey("value")
if let fieldKey = dictionary[KeyFieldKey] as? String { if let fieldKey = dictionary[KeyFieldKey] as? String {
@ -463,7 +462,7 @@ import MVMCore
// MARK:- FormValidationProtocol // MARK:- FormValidationProtocol
extension Checkbox: FormValidationFormFieldProtocol { extension Checkbox: FormValidationFormFieldProtocol {
public func formFieldGroupName() -> String? { public func formFieldGroupName() -> String? {
return groupName return groupName
} }

View File

@ -7,7 +7,7 @@
// //
@objcMembers open class CheckboxWithLabelView: ViewConstrainingView { @objcMembers open class CheckboxWithLabelView: View {
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Outlets // MARK: - Outlets
//-------------------------------------------------- //--------------------------------------------------
@ -19,9 +19,7 @@
// MARK: - Properties // MARK: - Properties
//-------------------------------------------------- //--------------------------------------------------
var sizeObject: MFSizeObject? = MFSizeObject(standardSize: Checkbox.defaultHeightWidth, standardiPadPortraitSize: Checkbox.defaultHeightWidth + 6.0) public var checkboxPosition: CheckboxPosition = .center
var checkboxPosition: CheckboxPosition = .center
public enum CheckboxPosition: String { public enum CheckboxPosition: String {
case center case center
@ -32,13 +30,10 @@
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Constraints // MARK: - Constraints
//-------------------------------------------------- //--------------------------------------------------
var checkboxWidthConstraint: NSLayoutConstraint? public var checkboxTopConstraint: NSLayoutConstraint?
var checkboxHeightConstraint: NSLayoutConstraint? public var checkboxBottomConstraint: NSLayoutConstraint?
var checkboxTopConstraint: NSLayoutConstraint? public var checkboxCenterYConstraint: NSLayoutConstraint?
var checkboxBottomConstraint: NSLayoutConstraint?
var checkboxCenterYConstraint: NSLayoutConstraint?
var centerLabelCheckboxConstraint: NSLayoutConstraint?
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Life Cycle // MARK: - Life Cycle
@ -49,32 +44,20 @@
guard subviews.isEmpty else { return } guard subviews.isEmpty else { return }
translatesAutoresizingMaskIntoConstraints = false
addSubview(checkbox) addSubview(checkbox)
addSubview(label) addSubview(label)
label.text = "" 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.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) checkboxBottomConstraint = layoutMarginsGuide.bottomAnchor.constraint(equalTo: checkbox.bottomAnchor)
checkboxBottomConstraint?.isActive = true
checkboxTopConstraint = checkbox.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor) checkboxTopConstraint = checkbox.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor)
checkboxTopConstraint?.isActive = true
checkboxCenterYConstraint = checkbox.centerYAnchor.constraint(equalTo: centerYAnchor) checkboxCenterYConstraint = checkbox.centerYAnchor.constraint(equalTo: centerYAnchor)
centerLabelCheckboxConstraint = label.centerYAnchor.constraint(equalTo: checkbox.centerYAnchor)
label.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor).isActive = true label.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor).isActive = true
layoutMarginsGuide.trailingAnchor.constraint(equalTo: label.trailingAnchor).isActive = true layoutMarginsGuide.trailingAnchor.constraint(equalTo: label.trailingAnchor).isActive = true
@ -82,7 +65,7 @@
layoutMarginsGuide.bottomAnchor.constraint(greaterThanOrEqualTo: label.bottomAnchor).isActive = true layoutMarginsGuide.bottomAnchor.constraint(greaterThanOrEqualTo: label.bottomAnchor).isActive = true
let bottomLabelConstraint = layoutMarginsGuide.bottomAnchor.constraint(equalTo: label.bottomAnchor) let bottomLabelConstraint = layoutMarginsGuide.bottomAnchor.constraint(equalTo: label.bottomAnchor)
bottomLabelConstraint.priority = UILayoutPriority(249) bottomLabelConstraint.priority = .defaultLow
bottomLabelConstraint.isActive = true bottomLabelConstraint.isActive = true
alignCheckbox(.center) alignCheckbox(.center)
@ -92,17 +75,12 @@
// MARK: - Initializers // MARK: - Initializers
//-------------------------------------------------- //--------------------------------------------------
required public init?(coder: NSCoder) { public override init(frame: CGRect) {
super.init(coder: coder)
fatalError("xib file is not implemented for CheckboxWithLabelView")
}
override public init(frame: CGRect) {
super.init(frame: frame) super.init(frame: frame)
setupView() setupView()
} }
public convenience init() { public convenience override init() {
self.init(frame: .zero) self.init(frame: .zero)
} }
@ -112,6 +90,11 @@
alignCheckbox(position) alignCheckbox(position)
} }
required public init?(coder: NSCoder) {
super.init(coder: coder)
fatalError("xib file is not implemented for CheckboxWithLabelView")
}
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Methods // MARK: - Methods
//-------------------------------------------------- //--------------------------------------------------
@ -125,64 +108,41 @@
checkboxBottomConstraint?.isActive = false checkboxBottomConstraint?.isActive = false
checkboxTopConstraint?.isActive = false checkboxTopConstraint?.isActive = false
checkboxCenterYConstraint?.isActive = true checkboxCenterYConstraint?.isActive = true
centerLabelCheckboxConstraint?.isActive = true
case .top: case .top:
checkboxBottomConstraint?.isActive = false checkboxBottomConstraint?.isActive = false
checkboxTopConstraint?.isActive = true checkboxTopConstraint?.isActive = true
checkboxCenterYConstraint?.isActive = false checkboxCenterYConstraint?.isActive = false
centerLabelCheckboxConstraint?.isActive = false
case .bottom: case .bottom:
checkboxBottomConstraint?.isActive = true checkboxBottomConstraint?.isActive = true
checkboxTopConstraint?.isActive = false checkboxTopConstraint?.isActive = false
checkboxCenterYConstraint?.isActive = false checkboxCenterYConstraint?.isActive = false
centerLabelCheckboxConstraint?.isActive = false
} }
} }
} }
/// MARK: - Molecular // MARK: - Molecular
extension CheckboxWithLabelView { extension CheckboxWithLabelView {
override open class func estimatedHeight(forRow json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { open class func estimatedHeight(forRow json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat {
return CGFloat(Checkbox.defaultHeightWidth) return 200
} }
@objc override open func updateView(_ size: CGFloat) { @objc override open func updateView(_ size: CGFloat) {
super.updateView(size) super.updateView(size)
label.updateView(size) label.updateView(size)
checkbox.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() 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() { open override func reset() {
super.reset() super.reset()
label.text = "" label.text = ""
checkbox.reset() checkbox.reset()
alignCheckbox(.center)
} }
override open func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { override open func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {

View File

@ -0,0 +1,55 @@
//
// DropDown.swift
// MVMCoreUI
//
// Created by Scott Pfeil on 11/26/19.
// Copyright © 2019 Verizon Wireless. All rights reserved.
//
import UIKit
@objcMembers public class DropDown: MFTextField {
let picker = MVMCoreUICommonViewsUtility.commonPickerView()!
public override func getNib() -> UINib? {
return UINib(nibName: String(describing: MFTextField.self), bundle: MVMCoreUIUtility.bundleForMVMCoreUI())
}
public override func setupView() {
super.setupView()
dropDownCarrotWidth?.isActive = false
errorHeightConstraint?.constant = 0
}
override public func setWithJSON(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) {
super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
guard let textField = textField, textField.inputView == nil else { return }
picker.delegate = self
picker.dataSource = self
picker.tag = textField.tag
textField.inputView = picker
picker.reloadAllComponents()
MVMCoreUICommonViewsUtility.addDismissToolbar(textField, delegate: delegateObject?.uiTextFieldDelegate)
textField.text = json?.stringWithChainOfKeysOrIndexes(["options",picker.selectedRow(inComponent: 0)])
}
}
extension DropDown: UIPickerViewDelegate {
public func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return json?.stringWithChainOfKeysOrIndexes(["options",row])
}
public func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
textField?.text = json?.stringWithChainOfKeysOrIndexes(["options",row])
}
}
extension DropDown: UIPickerViewDataSource {
public func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return json?.optionalArrayForKey("options")?.count ?? 0
}
}

View File

@ -93,8 +93,8 @@ public struct GraphObject {
mutating func updateSize() { mutating func updateSize() {
switch size { switch size {
case .small: case .small:
diameter = MFSizeObject(standardSize: 24)?.getValueBasedOnApplicationWidth() ?? 24 diameter = MFSizeObject(standardSize: 20)?.getValueBasedOnApplicationWidth() ?? 20
lineWidth = MFSizeObject(standardSize: 5)?.getValueBasedOnApplicationWidth() ?? 5 lineWidth = MFSizeObject(standardSize: 4)?.getValueBasedOnApplicationWidth() ?? 4
break break
case .medium: case .medium:
diameter = MFSizeObject(standardSize: 100)?.getValueBasedOnApplicationWidth() ?? 100 diameter = MFSizeObject(standardSize: 100)?.getValueBasedOnApplicationWidth() ?? 100

View File

@ -91,6 +91,7 @@ public typealias ActionBlock = () -> ()
translatesAutoresizingMaskIntoConstraints = false translatesAutoresizingMaskIntoConstraints = false
clauses = [] clauses = []
accessibilityCustomActions = [] accessibilityCustomActions = []
accessibilityTraits = .staticText
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(textLinkTapped(_:))) let tapGesture = UITapGestureRecognizer(target: self, action: #selector(textLinkTapped(_:)))
tapGesture.numberOfTapsRequired = 1 tapGesture.numberOfTapsRequired = 1
@ -212,9 +213,12 @@ public typealias ActionBlock = () -> ()
} }
@objc public static func setUILabel(_ label: UILabel?, withJSON json: [AnyHashable: Any]?, delegate: DelegateObject?, additionalData: [AnyHashable: Any]?) { @objc public static func setUILabel(_ label: UILabel?, withJSON json: [AnyHashable: Any]?, delegate: DelegateObject?, additionalData: [AnyHashable: Any]?) {
guard let label = label else { return } guard let label = label else { return }
label.attributedText = nil
// Some properties can only be set on Label.
// Label fonts should not be scaled because it will be scaled in updateView.
let mvmLabel = label as? Label
label.text = json?.optionalStringForKey(KeyText) label.text = json?.optionalStringForKey(KeyText)
setLabel(label, withHTML: json?.optionalStringForKey("html")) setLabel(label, withHTML: json?.optionalStringForKey("html"))
@ -230,9 +234,7 @@ public typealias ActionBlock = () -> ()
} }
} }
if let wholeViewIsClickable = json?.boolForKey("makeWholeViewClickable") { mvmLabel?.makeWholeViewClickable = json?.boolForKey("makeWholeViewClickable") ?? false
(label as? Label)?.makeWholeViewClickable = wholeViewIsClickable
}
if let backgroundColorHex = json?.optionalStringForKey(KeyBackgroundColor), !backgroundColorHex.isEmpty { if let backgroundColorHex = json?.optionalStringForKey(KeyBackgroundColor), !backgroundColorHex.isEmpty {
label.backgroundColor = UIColor.mfGet(forHex: backgroundColorHex) label.backgroundColor = UIColor.mfGet(forHex: backgroundColorHex)
@ -241,12 +243,16 @@ public typealias ActionBlock = () -> ()
label.accessibilityLabel = json?.optionalStringForKey("accessibilityText") label.accessibilityLabel = json?.optionalStringForKey("accessibilityText")
if let fontStyle = json?.optionalStringForKey("fontStyle") { if let fontStyle = json?.optionalStringForKey("fontStyle") {
MFStyler.styleLabel(label, withStyle: fontStyle) MFStyler.styleLabel(label, withStyle: fontStyle, genericScaling: mvmLabel == nil)
mvmLabel?.standardFontSize = label.font.pointSize
} else { } else {
let fontSize = json?["fontSize"] as? CGFloat let fontSize = json?["fontSize"] as? CGFloat
if let fontSize = fontSize {
mvmLabel?.standardFontSize = fontSize
}
if let fontName = json?.optionalStringForKey("fontName") { if let fontName = json?.optionalStringForKey("fontName") {
label.font = MFFonts.mfFont(withName: fontName, size: fontSize ?? label.font.pointSize) label.font = MFFonts.mfFont(withName: fontName, size: fontSize ?? mvmLabel?.standardFontSize ?? label.font.pointSize)
} else if let fontSize = fontSize { } else if let fontSize = fontSize {
label.font = label.font.withSize(fontSize) label.font = label.font.withSize(fontSize)
} }
@ -256,8 +262,8 @@ public typealias ActionBlock = () -> ()
label.textColor = UIColor.mfGet(forHex: textColorHex) label.textColor = UIColor.mfGet(forHex: textColorHex)
} }
if let attributes = json?.arrayForKey("attributes"), let labelText = label.text { if let attributes = json?.optionalArrayForKey("attributes"), let labelText = label.text {
let attributedString = NSMutableAttributedString(string: labelText, attributes: [NSAttributedString.Key.font: label.font as UIFont, let attributedString = NSMutableAttributedString(string: labelText, attributes: [NSAttributedString.Key.font: mvmLabel?.font.withSize(mvmLabel!.standardFontSize) ?? label.font as UIFont,
NSAttributedString.Key.foregroundColor: label.textColor as UIColor]) NSAttributedString.Key.foregroundColor: label.textColor as UIColor])
for case let attribute as [String: Any] in attributes { for case let attribute as [String: Any] in attributes {
guard let attributeType = attribute.optionalStringForKey(KeyType), guard let attributeType = attribute.optionalStringForKey(KeyType),
@ -298,7 +304,7 @@ public typealias ActionBlock = () -> ()
case "font": case "font":
if let fontStyle = attribute.optionalStringForKey("style") { if let fontStyle = attribute.optionalStringForKey("style") {
let styles = MFStyler.styleGetAttributedString("0", withStyle: fontStyle) let styles = MFStyler.styleGetAttributedString("0", withStyle: fontStyle, genericScaling: mvmLabel == nil)
attributedString.removeAttribute(.font, range: range) attributedString.removeAttribute(.font, range: range)
attributedString.removeAttribute(.foregroundColor, range: range) attributedString.removeAttribute(.foregroundColor, range: range)
attributedString.addAttributes(styles.attributes(at: 0, effectiveRange: nil), range: range) attributedString.addAttributes(styles.attributes(at: 0, effectiveRange: nil), range: range)
@ -307,7 +313,7 @@ public typealias ActionBlock = () -> ()
var font: UIFont? var font: UIFont?
if let fontName = attribute.optionalStringForKey("name") { if let fontName = attribute.optionalStringForKey("name") {
font = MFFonts.mfFont(withName: fontName, size: fontSize ?? label.font.pointSize) font = MFFonts.mfFont(withName: fontName, size: fontSize ?? mvmLabel?.standardFontSize ?? label.font.pointSize)
} else if let fontSize = fontSize { } else if let fontSize = fontSize {
font = label.font.withSize(fontSize) font = label.font.withSize(fontSize)
} }
@ -330,6 +336,7 @@ public typealias ActionBlock = () -> ()
} }
} }
label.attributedText = attributedString label.attributedText = attributedString
mvmLabel?.originalAttributedString = attributedString
} }
} }
@ -419,7 +426,7 @@ public typealias ActionBlock = () -> ()
if let floatScale = scaleSize?.floatValue { if let floatScale = scaleSize?.floatValue {
updateView(CGFloat(floatScale)) updateView(CGFloat(floatScale))
} else { } else {
updateView(MVMCoreUISplitViewController.getApplicationViewWidth()) updateView(MVMCoreUIUtility.getWidth())
} }
} else { } else {
standardFontSize = 0 standardFontSize = 0
@ -516,6 +523,7 @@ public typealias ActionBlock = () -> ()
func appendActionableClause(range: NSRange, actionBlock: @escaping ActionBlock) { func appendActionableClause(range: NSRange, actionBlock: @escaping ActionBlock) {
accessibilityTraits = .button
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))
} }
@ -576,13 +584,12 @@ extension Label {
styleB2(true) styleB2(true)
accessibilityCustomActions = [] accessibilityCustomActions = []
clauses = [] clauses = []
accessibilityTraits = .staticText
} }
@objc public func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { @objc public func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
clauses = [] clauses = []
Label.setUILabel(self, withJSON: json, delegate: delegateObject, additionalData: additionalData) Label.setUILabel(self, withJSON: json, delegate: delegateObject, additionalData: additionalData)
originalAttributedString = attributedText
hero = json?["hero"] as? Int hero = json?["hero"] as? Int
} }
@ -594,7 +601,7 @@ extension Label {
return true return true
} }
public func alignment() -> UIStackView.Alignment { public func horizontalAlignment() -> UIStackView.Alignment {
return .leading return .leading
} }
@ -717,7 +724,6 @@ extension UITapGestureRecognizer {
if label.makeWholeViewClickable { if label.makeWholeViewClickable {
return true return true
} }
guard let abstractContainer = label.abstractTextContainer() else { return false } guard let abstractContainer = label.abstractTextContainer() else { return false }
let textContainer = abstractContainer.0 let textContainer = abstractContainer.0
let layoutManager = abstractContainer.1 let layoutManager = abstractContainer.1
@ -771,7 +777,7 @@ extension Label {
} }
@objc public func accessibilityCustomAction(_ action: UIAccessibilityCustomAction) { @objc public func accessibilityCustomAction(_ action: UIAccessibilityCustomAction) {
for clause in clauses { for clause in clauses {
if action.hash == clause.accessibilityID { if action.hash == clause.accessibilityID {
clause.performAction() clause.performAction()
@ -779,4 +785,19 @@ extension Label {
} }
} }
} }
open override func accessibilityActivate() -> Bool {
guard let accessibleActions = accessibilityCustomActions else { return false }
for clause in clauses {
for action in accessibleActions {
if action.hash == clause.accessibilityID {
clause.performAction()
return true
}
}
}
return false
}
} }

View File

@ -38,8 +38,6 @@ import UIKit
case .none: case .none:
heightConstraint?.constant = 0 heightConstraint?.constant = 0
} }
setNeedsLayout()
layoutIfNeeded()
} }
} }

View File

@ -193,7 +193,7 @@ const CGFloat SwitchShakeIntensity = 2;
return YES; return YES;
} }
- (UIStackViewAlignment)alignment { - (UIStackViewAlignment)horizontalAlignment {
return UIStackViewAlignmentTrailing; return UIStackViewAlignmentTrailing;
} }

View File

@ -54,8 +54,9 @@ import Foundation
if let thickness = json?.optionalCGFloatForKey("thickness") { if let thickness = json?.optionalCGFloatForKey("thickness") {
self.thickness = thickness self.thickness = thickness
} }
if let percentage = json?["percent"] as? Float { // as? Float returns nil, apple defect.
progress = percentage/100.0 if let percentage = json?["percent"] as? CGFloat {
progress = Float(percentage/100.0)
} }
if let progressColor = json?.optionalStringForKey("progressColor") { if let progressColor = json?.optionalStringForKey("progressColor") {
progressTintColor = UIColor.mfGet(forHex: progressColor) progressTintColor = UIColor.mfGet(forHex: progressColor)

View File

@ -357,7 +357,6 @@
if (!self.constrainedView) { if (!self.constrainedView) {
[super setWithJSON:json delegateObject:delegateObject additionalData:additionalData]; [super setWithJSON:json delegateObject:delegateObject additionalData:additionalData];
} }
[self.molecule setWithJSON:json delegateObject:delegateObject additionalData:additionalData];
if (self.shouldSetupMoleculeFromJSON) { if (self.shouldSetupMoleculeFromJSON) {
NSDictionary *moleculeJSON = [json dict:KeyMolecule]; NSDictionary *moleculeJSON = [json dict:KeyMolecule];
if (self.molecule) { if (self.molecule) {

View File

@ -8,27 +8,40 @@
import UIKit import UIKit
public class Control: UIControl { @objcMembers open class Control: UIControl {
var json: [AnyHashable: Any]? //--------------------------------------------------
// MARK: - Properties
//--------------------------------------------------
public var json: [AnyHashable: Any]?
private var initialSetupPerformed = false private var initialSetupPerformed = false
//--------------------------------------------------
// MARK: - Initializers
//--------------------------------------------------
public override init(frame: CGRect) { public override init(frame: CGRect) {
super.init(frame: .zero) super.init(frame: .zero)
initialSetup() initialSetup()
} }
init() { public init() {
super.init(frame: .zero) super.init(frame: .zero)
initialSetup() initialSetup()
} }
public required init?(coder: NSCoder) { public required init?(coder: NSCoder) {
super.init(coder: coder) super.init(coder: coder)
initialSetup() fatalError("Control does not support xib.")
} }
//--------------------------------------------------
// MARK: - Setup
//--------------------------------------------------
public func initialSetup() { public func initialSetup() {
if !initialSetupPerformed { if !initialSetupPerformed {
initialSetupPerformed = true initialSetupPerformed = true
setupView() setupView()
@ -36,9 +49,19 @@ public class Control: UIControl {
} }
} }
extension Control: MVMCoreViewProtocol { // MARK: - AppleGuidelinesProtocol
public func updateView(_ size: CGFloat) { extension Control: AppleGuidelinesProtocol {
override open func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
return Self.acceptablyOutsideBounds(point: point, bounds: bounds)
} }
}
// MARK: - MVMCoreViewProtocol
extension Control: MVMCoreViewProtocol {
public func updateView(_ size: CGFloat) {}
/// Will be called only once. /// Will be called only once.
public func setupView() { public func setupView() {
@ -47,8 +70,9 @@ extension Control: MVMCoreViewProtocol {
} }
} }
// MARK: - MVMCoreUIMoleculeViewProtocol
extension Control: MVMCoreUIMoleculeViewProtocol { extension Control: 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
if let backgroundColorString = json?.optionalStringForKey(KeyBackgroundColor) { if let backgroundColorString = json?.optionalStringForKey(KeyBackgroundColor) {

View File

@ -0,0 +1,32 @@
//
// AppleGuidelinesProtocol.swift
// MVMCoreUI
//
// Created by Kevin Christiano on 12/20/19.
// Copyright © 2019 Verizon Wireless. All rights reserved.
//
import UIKit
public protocol AppleGuidelinesProtocol {
static var minimumTappableArea: CGFloat { get }
static func acceptablyOutsideBounds(point: CGPoint, bounds: CGRect) -> Bool
}
extension AppleGuidelinesProtocol {
static public var minimumTappableArea: CGFloat {
return 44.0
}
// If the control is smaller than 44pt by width or height, this will compensate.
static public func acceptablyOutsideBounds(point: CGPoint, bounds: CGRect) -> Bool {
let faultToleranceX: CGFloat = max((minimumTappableArea - bounds.size.width) / 2.0, 0)
let faultToleranceY: CGFloat = max((minimumTappableArea - bounds.size.height) / 2.0, 0)
let area = bounds.insetBy(dx: -faultToleranceX, dy: -faultToleranceY)
return area.contains(point)
}
}

View File

@ -91,7 +91,7 @@ static NSTimeInterval const HandScrollAnimationTiming = 7.f;
- (void)viewDidLayoutSubviews { - (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews]; [super viewDidLayoutSubviews];
BOOL automaticInset = self.navigationController && self.scrollView.contentInsetAdjustmentBehavior == UIScrollViewContentInsetAdjustmentAutomatic; BOOL automaticInset = 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)) {

View File

@ -0,0 +1,239 @@
//
// Container.swift
// MVMCoreUI
//
// Created by Scott Pfeil on 12/11/19.
// Copyright © 2019 Verizon Wireless. All rights reserved.
//
import UIKit
public protocol ContainerModelProtocol {
var horizontalAlignment: UIStackView.Alignment? { get set }
var verticalAlignment: UIStackView.Alignment? { get set }
var useHorizontalMargins: Bool? { get set }
var useVerticalMargins: Bool? { get set }
}
public class ContainerHelper: NSObject {
var leftConstraint: NSLayoutConstraint?
var topConstraint: NSLayoutConstraint?
var bottomConstraint: NSLayoutConstraint?
var rightConstraint: NSLayoutConstraint?
var alignCenterHorizontalConstraint: NSLayoutConstraint?
var alignCenterLeftConstraint: NSLayoutConstraint?
var alignCenterRightConstraint: NSLayoutConstraint?
var alignCenterVerticalConstraint: NSLayoutConstraint?
var alignCenterTopConstraint: NSLayoutConstraint?
var alignCenterBottomConstraint: NSLayoutConstraint?
var leftLowConstraint: NSLayoutConstraint?
var topLowConstraint: NSLayoutConstraint?
var bottomLowConstraint: NSLayoutConstraint?
var rightLowConstraint: NSLayoutConstraint?
func constrainView(_ view: UIView) {
guard let margins = view.superview?.layoutMarginsGuide else { return }
leftConstraint = view.leftAnchor.constraint(equalTo: margins.leftAnchor)
leftConstraint?.isActive = true
topConstraint = view.topAnchor.constraint(equalTo: margins.topAnchor)
topConstraint?.isActive = true
rightConstraint = margins.rightAnchor.constraint(equalTo: view.rightAnchor)
rightConstraint?.isActive = true
bottomConstraint = margins.bottomAnchor.constraint(equalTo: view.bottomAnchor)
bottomConstraint?.isActive = true
alignCenterHorizontalConstraint = view.centerXAnchor.constraint(equalTo: margins.centerXAnchor)
alignCenterLeftConstraint = view.leftAnchor.constraint(greaterThanOrEqualTo: margins.leftAnchor)
alignCenterRightConstraint = margins.rightAnchor.constraint(greaterThanOrEqualTo: view.rightAnchor)
alignCenterVerticalConstraint = view.centerYAnchor.constraint(equalTo: margins.centerYAnchor)
alignCenterTopConstraint = view.topAnchor.constraint(greaterThanOrEqualTo: margins.topAnchor)
alignCenterBottomConstraint = margins.bottomAnchor.constraint(greaterThanOrEqualTo: view.bottomAnchor)
leftLowConstraint = view.leftAnchor.constraint(equalTo: margins.leftAnchor)
leftLowConstraint?.priority = UILayoutPriority(rawValue: 200)
leftLowConstraint?.isActive = true
topLowConstraint = view.topAnchor.constraint(equalTo: margins.topAnchor)
topLowConstraint?.priority = UILayoutPriority(rawValue: 200)
topLowConstraint?.isActive = true
rightLowConstraint = margins.rightAnchor.constraint(equalTo: view.rightAnchor)
rightLowConstraint?.priority = UILayoutPriority(rawValue: 200)
rightLowConstraint?.isActive = true
bottomLowConstraint = margins.bottomAnchor.constraint(equalTo: view.bottomAnchor)
bottomLowConstraint?.priority = UILayoutPriority(rawValue: 200)
bottomLowConstraint?.isActive = true
setAccessibility(view)
}
func setAccessibility(_ view: UIView) {
guard let superView = view.superview else { return }
superView.isAccessibilityElement = false
if let elements = view.accessibilityElements {
superView.accessibilityElements = elements
} else {
superView.accessibilityElements = [view]
}
}
func alignHorizontal(_ alignment: UIStackView.Alignment) {
switch alignment {
case .center:
alignCenterHorizontalConstraint?.isActive = true
alignCenterLeftConstraint?.isActive = true
alignCenterRightConstraint?.isActive = true
leftConstraint?.isActive = false
rightConstraint?.isActive = false
case .leading:
alignCenterHorizontalConstraint?.isActive = false
alignCenterLeftConstraint?.isActive = false
alignCenterRightConstraint?.isActive = true
leftConstraint?.isActive = true
rightConstraint?.isActive = false
case .trailing:
alignCenterHorizontalConstraint?.isActive = false
alignCenterLeftConstraint?.isActive = true
alignCenterRightConstraint?.isActive = false
leftConstraint?.isActive = false
rightConstraint?.isActive = true
case .fill:
alignCenterHorizontalConstraint?.isActive = false
alignCenterLeftConstraint?.isActive = false
alignCenterRightConstraint?.isActive = false
leftConstraint?.isActive = true
rightConstraint?.isActive = true
default: break
}
}
func alignVertical(_ alignment: UIStackView.Alignment) {
switch alignment {
case .center:
alignCenterVerticalConstraint?.isActive = true
alignCenterTopConstraint?.isActive = true
alignCenterBottomConstraint?.isActive = true
topConstraint?.isActive = false
bottomConstraint?.isActive = false
case .leading:
alignCenterVerticalConstraint?.isActive = false
alignCenterTopConstraint?.isActive = false
alignCenterBottomConstraint?.isActive = true
topConstraint?.isActive = true
bottomConstraint?.isActive = false
case .trailing:
alignCenterVerticalConstraint?.isActive = false
alignCenterTopConstraint?.isActive = true
alignCenterBottomConstraint?.isActive = false
topConstraint?.isActive = false
bottomConstraint?.isActive = true
case .fill:
alignCenterVerticalConstraint?.isActive = false
alignCenterTopConstraint?.isActive = false
alignCenterBottomConstraint?.isActive = false
topConstraint?.isActive = true
bottomConstraint?.isActive = true
default: break
}
}
func set(with model: ContainerModelProtocol) {
if let horizontalAlignment = model.horizontalAlignment {
alignHorizontal(horizontalAlignment)
}
if let verticalAlignment = model.verticalAlignment {
alignVertical(verticalAlignment)
}
}
static func getAlignment(for string: String) -> UIStackView.Alignment? {
switch string {
case "leading":
return .leading
case "trailing":
return .trailing
case "center":
return .center
case "fill":
return .fill
default:
return nil
}
}
func set(with JSON: [AnyHashable: Any]?, for contained: UIView) {
if let horizontalAlignmentString = JSON?.optionalStringForKey("horizontalAlignment"), let alignment = ContainerHelper.getAlignment(for: horizontalAlignmentString) ?? (contained as? MVMCoreUIViewConstrainingProtocol)?.horizontalAlignment?() {
alignHorizontal(alignment)
} else if let alignment = (contained as? MVMCoreUIViewConstrainingProtocol)?.horizontalAlignment?() {
alignHorizontal(alignment)
}
if let verticalAlignmentString = JSON?.optionalStringForKey("verticalAlignment"), let alignment = ContainerHelper.getAlignment(for: verticalAlignmentString) ?? (contained as? MVMCoreUIViewConstrainingProtocol)?.verticalAlignment?() {
alignVertical(alignment)
} else if let alignment = (contained as? MVMCoreUIViewConstrainingProtocol)?.verticalAlignment?() {
alignVertical(alignment)
}
}
}
open class Container: View {
var model: ContainerModelProtocol?
var view: UIView?
let containerHelper = ContainerHelper()
var topMarginPadding: CGFloat = 0
var bottomMarginPadding: CGFloat = 0
}
// MARK: - MVMCoreViewProtocol
public extension Container {
override func updateView(_ size: CGFloat) {
super.updateView(size)
(view as? MVMCoreViewProtocol)?.updateView(size)
MFStyler.setMarginsFor(self, size: size, defaultHorizontal: model?.useHorizontalMargins ?? true, top: model?.useHorizontalMargins ?? true ? topMarginPadding : 0, bottom: model?.useHorizontalMargins ?? true ? bottomMarginPadding : 0)
}
/// Will be called only once.
override func setupView() {
super.setupView()
backgroundColor = .clear
}
func addAndContain(_ view: UIView) {
view.translatesAutoresizingMaskIntoConstraints = false
addSubview(view)
containerHelper.constrainView(view)
self.view = view
}
convenience init(andContain view: UIView) {
self.init()
addAndContain(view)
}
}
// MARK: - MVMCoreUIMoleculeViewProtocol
public extension Container {
override func setWithJSON(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) {
super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
guard let view = view else { return }
containerHelper.set(with: json, for: view)
}
override func reset() {
super.reset()
(view as? MVMCoreUIMoleculeViewProtocol)?.reset?()
}
func setAsMolecule() {
(view as? MVMCoreUIMoleculeViewProtocol)?.setAsMolecule?()
}
}

View File

@ -16,7 +16,9 @@ NS_ASSUME_NONNULL_BEGIN
@optional @optional
- (void)panelWillAppear:(nonnull NSObject <MVMCoreUIPanelProtocol>*)panel; - (void)panelWillAppear:(nonnull NSObject <MVMCoreUIPanelProtocol>*)panel;
- (void)panelWillAppear:(nonnull NSObject <MVMCoreUIPanelProtocol>*)panel overtakingDetail:(BOOL)willOvertake;
- (void)panelDidAppear:(nonnull NSObject <MVMCoreUIPanelProtocol>*)panel; - (void)panelDidAppear:(nonnull NSObject <MVMCoreUIPanelProtocol>*)panel;
- (void)panelDidAppear:(nonnull NSObject <MVMCoreUIPanelProtocol>*)panel overtakingDetail:(BOOL)didOvertake;
- (void)panelWillDisappear:(nonnull NSObject <MVMCoreUIPanelProtocol>*)panel; - (void)panelWillDisappear:(nonnull NSObject <MVMCoreUIPanelProtocol>*)panel;
- (void)panelDidDisappear:(nonnull NSObject <MVMCoreUIPanelProtocol>*)panel; - (void)panelDidDisappear:(nonnull NSObject <MVMCoreUIPanelProtocol>*)panel;

View File

@ -357,16 +357,19 @@ CGFloat const PanelAnimationDuration = 0.2;
- (void)showLeftPanelAnimated:(BOOL)animated explict:(BOOL)explict { - (void)showLeftPanelAnimated:(BOOL)animated explict:(BOOL)explict {
[MVMCoreDispatchUtility performBlockOnMainThread:^{ [MVMCoreDispatchUtility performBlockOnMainThread:^{
if (self.mainViewLeading.constant < .1) { if (self.mainViewLeading.constant < .1) {
BOOL shouldExtendLeftPanel = [self shouldExtendLeftPanel];
if (explict) { if (explict) {
self.explictlyShowingPanel = self.leftPanel; self.explictlyShowingPanel = self.leftPanel;
} }
void (^animations)(void) = [self getLeftPanelShowAnimationBlock]; void (^animations)(void) = [self getLeftPanelShowAnimationBlock];
void (^completion)(BOOL) = ^(BOOL finished){ void (^completion)(BOOL) = ^(BOOL finished){
[self panelDidAppear:self.leftPanel animated:animated]; [self panelDidAppear:self.leftPanel didExtend:shouldExtendLeftPanel animated:animated];
}; };
if (![self shouldExtendLeftPanel]) { if (!shouldExtendLeftPanel) {
if ([self.leftPanel respondsToSelector:@selector(showArrow)]){ if ([self.leftPanel respondsToSelector:@selector(showArrow)]){
[self.leftPanel showArrow]; [self.leftPanel showArrow];
} }
@ -389,7 +392,7 @@ CGFloat const PanelAnimationDuration = 0.2;
} }
self.mainViewCoverView.hidden = NO; self.mainViewCoverView.hidden = NO;
[self panelWillAppear:self.leftPanel animated:animated]; [self panelWillAppear:self.leftPanel willExtend:shouldExtendLeftPanel animated:animated];
if (animated) { if (animated) {
[UIView animateWithDuration:PanelAnimationDuration delay:0 options:UIViewAnimationOptionCurveLinear animations:animations completion:completion]; [UIView animateWithDuration:PanelAnimationDuration delay:0 options:UIViewAnimationOptionCurveLinear animations:animations completion:completion];
} else { } else {
@ -547,19 +550,22 @@ CGFloat const PanelAnimationDuration = 0.2;
- (void)showRightPanelAnimated:(BOOL)animated explict:(BOOL)explict { - (void)showRightPanelAnimated:(BOOL)animated explict:(BOOL)explict {
[MVMCoreDispatchUtility performBlockOnMainThread:^{ [MVMCoreDispatchUtility performBlockOnMainThread:^{
if (self.mainViewTrailing.constant < .1) { if (self.mainViewTrailing.constant < .1) {
BOOL shouldExtendRightPanel = [self shouldExtendRightPanel];
if (explict) { if (explict) {
self.explictlyShowingPanel = self.rightPanel; self.explictlyShowingPanel = self.rightPanel;
} }
void (^animations)(void) = [self getRightPanelShowAnimationBlock]; void (^animations)(void) = [self getRightPanelShowAnimationBlock];
void (^completion)(BOOL) = ^(BOOL finished){ void (^completion)(BOOL) = ^(BOOL finished){
[self panelDidAppear:self.rightPanel animated:animated]; [self panelDidAppear:self.rightPanel didExtend:shouldExtendRightPanel animated:animated];
self.mainView.accessibilityElementsHidden = YES; self.mainView.accessibilityElementsHidden = YES;
UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self.rightPanel); UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self.rightPanel);
}; };
self.mainViewCoverView.hidden = NO; self.mainViewCoverView.hidden = NO;
if (![self shouldExtendRightPanel]) { if (!shouldExtendRightPanel) {
if ([self.rightPanel respondsToSelector:@selector(showArrow)]){ if ([self.rightPanel respondsToSelector:@selector(showArrow)]){
[self.rightPanel showArrow]; [self.rightPanel showArrow];
} }
@ -579,7 +585,7 @@ CGFloat const PanelAnimationDuration = 0.2;
self.rightPanelSeparator = rightPanelSeparator; self.rightPanelSeparator = rightPanelSeparator;
} }
[self panelWillAppear:self.rightPanel animated:animated]; [self panelWillAppear:self.rightPanel willExtend:shouldExtendRightPanel animated:animated];
if (animated) { if (animated) {
[UIView animateWithDuration:PanelAnimationDuration delay:0 options:UIViewAnimationOptionCurveLinear animations:animations completion:completion]; [UIView animateWithDuration:PanelAnimationDuration delay:0 options:UIViewAnimationOptionCurveLinear animations:animations completion:completion];
} else { } else {
@ -612,7 +618,7 @@ CGFloat const PanelAnimationDuration = 0.2;
[self hideRightPanelIfNeededAnimated:YES]; [self hideRightPanelIfNeededAnimated:YES];
} }
- (void)panelWillAppear:(UIViewController <MVMCoreUIPanelProtocol> *)panel animated:(BOOL)animated { - (void)panelWillAppear:(UIViewController <MVMCoreUIPanelProtocol> *)panel willExtend:(BOOL)willExtend animated:(BOOL)animated {
if ([panel respondsToSelector:@selector(willAppear:)]) { if ([panel respondsToSelector:@selector(willAppear:)]) {
[panel willAppear:animated]; [panel willAppear:animated];
} else { } else {
@ -621,13 +627,15 @@ CGFloat const PanelAnimationDuration = 0.2;
UIViewController *controller = [self getCurrentDetailViewController]; UIViewController *controller = [self getCurrentDetailViewController];
if ([controller.class conformsToProtocol:@protocol(MVMCoreUIDetailViewProtocol)]) { if ([controller.class conformsToProtocol:@protocol(MVMCoreUIDetailViewProtocol)]) {
UIViewController <MVMCoreUIDetailViewProtocol>* protocolController = (UIViewController <MVMCoreUIDetailViewProtocol>*)controller; UIViewController <MVMCoreUIDetailViewProtocol>* protocolController = (UIViewController <MVMCoreUIDetailViewProtocol>*)controller;
if ([protocolController respondsToSelector:@selector(panelWillAppear:)]) { if ([protocolController respondsToSelector:@selector(panelWillAppear:overtakingDetail:)]) {
[protocolController panelWillAppear:panel overtakingDetail:!willExtend];
} else if ([protocolController respondsToSelector:@selector(panelWillAppear:)]) {
[protocolController panelWillAppear:panel]; [protocolController panelWillAppear:panel];
} }
} }
} }
- (void)panelDidAppear:(UIViewController <MVMCoreUIPanelProtocol> *)panel animated:(BOOL)animated { - (void)panelDidAppear:(UIViewController <MVMCoreUIPanelProtocol> *)panel didExtend:(BOOL)didExtend animated:(BOOL)animated {
if ([panel respondsToSelector:@selector(didAppear:)]) { if ([panel respondsToSelector:@selector(didAppear:)]) {
[panel didAppear:animated]; [panel didAppear:animated];
} else { } else {
@ -636,7 +644,9 @@ CGFloat const PanelAnimationDuration = 0.2;
UIViewController *controller = [self getCurrentDetailViewController]; UIViewController *controller = [self getCurrentDetailViewController];
if ([controller.class conformsToProtocol:@protocol(MVMCoreUIDetailViewProtocol)]) { if ([controller.class conformsToProtocol:@protocol(MVMCoreUIDetailViewProtocol)]) {
UIViewController <MVMCoreUIDetailViewProtocol>* protocolController = (UIViewController <MVMCoreUIDetailViewProtocol>*)controller; UIViewController <MVMCoreUIDetailViewProtocol>* protocolController = (UIViewController <MVMCoreUIDetailViewProtocol>*)controller;
if ([protocolController respondsToSelector:@selector(panelDidAppear:)]) { if ([protocolController respondsToSelector:@selector(panelDidAppear:overtakingDetail:)]) {
[protocolController panelDidAppear:panel overtakingDetail:!didExtend];
} else if ([protocolController respondsToSelector:@selector(panelDidAppear:)]) {
[protocolController panelDidAppear:panel]; [protocolController panelDidAppear:panel];
} }
} }

View File

@ -54,7 +54,7 @@ static const CGFloat CheckBoxHeightWidth = 18.0;
return YES; return YES;
} }
- (UIStackViewAlignment)alignment { - (UIStackViewAlignment)horizontalAlignment {
return UIStackViewAlignmentLeading; return UIStackViewAlignmentLeading;
} }

View File

@ -0,0 +1,70 @@
//
// DropDownFilterTableViewCell.swift
// MVMCoreUI
//
// Created by Scott Pfeil on 9/6/19.
// Copyright © 2019 Verizon Wireless. All rights reserved.
//
import UIKit
@objcMembers public class DropDownFilterTableViewCell: TableViewCell {
let dropDown = DropDown(forDropDownWithBothDelegates: nil)
var delegateObject: MVMCoreUIDelegateObject?
var previousIndex = NSNotFound
var dropDownSelectionObservation: NSKeyValueObservation?
// MARK: - MFViewProtocol
override public func setupView() {
super.setupView()
guard let dropDown = dropDown, dropDown.superview == nil else {
return
}
bottomMarginPadding = 0
dropDown.translatesAutoresizingMaskIntoConstraints = false
contentView.addSubview(dropDown)
NSLayoutConstraint.activate(Array(NSLayoutConstraint.pinView(toSuperview: dropDown, useMargins: true).values))
#warning("Once we have the state manager, we will need to change this logic to only add or remove on user selection...Want to avoid re-use crashes from array size differences")
dropDownSelectionObservation = observe(
\.dropDown?.textField?.text,
options: [.old, .new]
) { [weak self] object, change in
guard change.newValue != change.oldValue, let self = self,
let options = self.dropDown?.json?.optionalArrayForKey("options") as? [NSString],
let index = options.firstIndex(of: change.newValue!! as NSString),
let moleculesArrays = self.json?.arrayForKey(KeyMolecules) as? [[[AnyHashable: Any]]] else { return }
if self.previousIndex != NSNotFound {
let previousMolecules = moleculesArrays[self.previousIndex]
self.delegateObject?.moleculeDelegate?.removeMolecules?(previousMolecules, sender: self, animation: .fade)
}
let molecules = moleculesArrays[index]
self.delegateObject?.moleculeDelegate?.addMolecules?(molecules, sender: self, animation: .fade)
self.previousIndex = index
}
}
public override func updateView(_ size: CGFloat) {
super.updateView(size)
dropDown?.updateView(size)
}
// MARK: - MoleculeDelegateProtocol
public override func setWithJSON(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) {
bottomSeparatorView?.style = .none
self.delegateObject = delegateObject
super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
dropDown?.mfTextFieldDelegate = delegateObject?.uiTextFieldDelegate as? MFTextFieldDelegate
dropDown?.uiTextFieldDelegate = delegateObject?.uiTextFieldDelegate
dropDown?.setWithJSON(json?.optionalDictionaryForKey("dropDown"), delegateObject: delegateObject, additionalData: additionalData)
}
public override func reset() {
super.reset()
bottomMarginPadding = 0
bottomSeparatorView?.style = .none
}
}

View File

@ -11,7 +11,8 @@ import UIKit
open class MoleculeCollectionViewCell: UICollectionViewCell, MVMCoreUIMoleculeViewProtocol, MoleculeListCellProtocol { open class MoleculeCollectionViewCell: UICollectionViewCell, MVMCoreUIMoleculeViewProtocol, MoleculeListCellProtocol {
open var molecule: (UIView & MVMCoreUIMoleculeViewProtocol)? open var molecule: (UIView & MVMCoreUIMoleculeViewProtocol)?
open var json: [AnyHashable: Any]? open var json: [AnyHashable: Any]?
public let containerHelper = ContainerHelper()
// In updateView, will set padding to default. // In updateView, will set padding to default.
open var updateViewHorizontalDefaults = true open var updateViewHorizontalDefaults = true
open var updateViewVerticalDefaults = true open var updateViewVerticalDefaults = true
@ -91,21 +92,19 @@ open class MoleculeCollectionViewCell: UICollectionViewCell, MVMCoreUIMoleculeVi
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: false) {
contentView.insertSubview(moleculeView, at: 0) contentView.insertSubview(moleculeView, at: 0)
NSLayoutConstraint.activate(Array(NSLayoutConstraint.pinView(toSuperview: moleculeView, useMargins: true).values)) containerHelper.constrainView(moleculeView)
molecule = moleculeView molecule = moleculeView
} }
} else { } else {
molecule?.setWithJSON(moleculeJSON, delegateObject: delegateObject, additionalData: additionalData) molecule?.setWithJSON(moleculeJSON, delegateObject: delegateObject, additionalData: additionalData)
} }
// This molecule will handle spacing by default.
if let castView = molecule as? MVMCoreUIViewConstrainingProtocol { guard let molecule = molecule else { return }
castView.shouldSetHorizontalMargins?(false) containerHelper.set(with: json, for: molecule)
castView.shouldSetVerticalMargins?(false)
}
accessibilityElements = molecule?.subviews accessibilityElements = molecule.subviews
} }
public func reset() { public func reset() {

View File

@ -11,11 +11,20 @@ import UIKit
@objcMembers open class MoleculeTableViewCell: TableViewCell { @objcMembers open class MoleculeTableViewCell: TableViewCell {
// MARK: - MVMCoreUIMoleculeViewProtocol // MARK: - MVMCoreUIMoleculeViewProtocol
public override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { public override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?)
{
guard let moleculeJSON = json?.optionalDictionaryForKey(KeyMolecule) else {
super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
return
}
if molecule == nil {
if let moleculeView = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(forJSON: moleculeJSON, delegateObject: delegateObject, constrainIfNeeded: false) {
addMolecule(moleculeView)
}
} else {
molecule?.setWithJSON(moleculeJSON, delegateObject: delegateObject, additionalData: additionalData)
}
super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
guard molecule == nil, let json = json, let moleculeJSON = json.optionalDictionaryForKey(KeyMolecule), let moleculeView = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(forJSON: moleculeJSON, delegateObject: delegateObject, constrainIfNeeded: true) else { return }
addMolecule(moleculeView)
} }
public override class func estimatedHeight(forRow json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { public override class func estimatedHeight(forRow json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat {

View File

@ -0,0 +1,56 @@
//
// StackItem.swift
// MVMCoreUI
//
// Created by Scott Pfeil on 12/13/19.
// Copyright © 2019 Verizon Wireless. All rights reserved.
//
import UIKit
open class StackItemModel: ContainerModelProtocol {
public var view: StackItem
public var spacing: CGFloat?
public var percentage: Int?
public var verticalAlignment: UIStackView.Alignment?
public var horizontalAlignment: UIStackView.Alignment?
public var useHorizontalMargins: Bool? = false
public var useVerticalMargins: Bool? = false
public var gone = false
init(with view: StackItem) {
self.view = view
view.model = self
}
init(with view: StackItem, json: [AnyHashable: Any]?) {
self.view = view
view.model = self
update(with: json)
}
func update(with json: [AnyHashable: Any]?) {
gone = json?.boolForKey("gone") ?? (json == nil)
spacing = json?.optionalCGFloatForKey("spacing")
percentage = json?["percent"] as? Int
if let horizontalAlignmentString = json?.optionalStringForKey("horizontalAlignment") {
horizontalAlignment = ContainerHelper.getAlignment(for: horizontalAlignmentString)
} else {
horizontalAlignment = nil
}
if let verticalAlignmentString = json?.optionalStringForKey("verticalAlignment") {
verticalAlignment = ContainerHelper.getAlignment(for: verticalAlignmentString)
} else {
verticalAlignment = nil
}
useHorizontalMargins = json?.optionalBoolForKey("useHorizontalMargins") ?? false
useVerticalMargins = json?.optionalBoolForKey("useVerticalMargins") ?? false
}
}
open class StackItem: MoleculeContainer {
}

View File

@ -11,7 +11,8 @@ import UIKit
@objcMembers open class TableViewCell: UITableViewCell, MVMCoreUIMoleculeViewProtocol, MoleculeListCellProtocol { @objcMembers open class TableViewCell: UITableViewCell, MVMCoreUIMoleculeViewProtocol, MoleculeListCellProtocol {
open var molecule: (UIView & MVMCoreUIMoleculeViewProtocol)? open var molecule: (UIView & MVMCoreUIMoleculeViewProtocol)?
open var json: [AnyHashable: Any]? open var json: [AnyHashable: Any]?
public let containerHelper = ContainerHelper()
// In updateView, will set padding to default. // In updateView, will set padding to default.
open var updateViewHorizontalDefaults = true open var updateViewHorizontalDefaults = true
@ -46,8 +47,12 @@ import UIKit
switch styleString { switch styleString {
case "standard": case "standard":
styleStandard() styleStandard()
case "header": case "shortDivider":
styleHeader() styleShortDivider()
case "tallDivider":
styleTallDivider()
case "sectionFooter":
styleFooter()
case "none": case "none":
styleNone() styleNone()
default: break default: break
@ -61,13 +66,27 @@ import UIKit
bottomSeparatorView?.style = .standard bottomSeparatorView?.style = .standard
} }
open func styleHeader() { open func styleTallDivider() {
topMarginPadding = 48 topMarginPadding = 48
bottomMarginPadding = 16 bottomMarginPadding = 16
topSeparatorView?.style = .none topSeparatorView?.style = .none
bottomSeparatorView?.style = .thin bottomSeparatorView?.style = .thin
} }
open func styleShortDivider() {
topMarginPadding = 32
bottomMarginPadding = 16
topSeparatorView?.style = .none
bottomSeparatorView?.style = .thin
}
open func styleFooter() {
topMarginPadding = 24
bottomMarginPadding = 0
topSeparatorView?.style = .none
bottomSeparatorView?.style = .none
}
open func styleNone() { open func styleNone() {
topMarginPadding = 0 topMarginPadding = 0
bottomMarginPadding = 0 bottomMarginPadding = 0
@ -78,14 +97,7 @@ import UIKit
/// Adds the molecule to the view. /// Adds the molecule to the view.
open func addMolecule(_ molecule: UIView & MVMCoreUIMoleculeViewProtocol) { open func addMolecule(_ molecule: UIView & MVMCoreUIMoleculeViewProtocol) {
contentView.addSubview(molecule) contentView.addSubview(molecule)
let standardConstraints = (molecule as? MVMCoreUIViewConstrainingProtocol)?.useStandardConstraints?() ?? true containerHelper.constrainView(molecule)
NSLayoutConstraint.activate(Array(NSLayoutConstraint.pinView(toSuperview: molecule, useMargins: standardConstraints).values))
// This molecule will by default handle margins.
if let castView = molecule as? MVMCoreUIViewConstrainingProtocol {
castView.shouldSetHorizontalMargins?(false)
castView.shouldSetVerticalMargins?(false)
}
self.molecule = molecule self.molecule = molecule
} }
@ -176,14 +188,8 @@ import UIKit
bottomSeparatorView?.setWithJSON(separator, delegateObject: delegateObject, additionalData: additionalData) bottomSeparatorView?.setWithJSON(separator, delegateObject: delegateObject, additionalData: additionalData)
} }
guard let moleculeJSON = json.optionalDictionaryForKey(KeyMolecule) else { return } guard let molecule = molecule else { return }
molecule?.setWithJSON(moleculeJSON, delegateObject: delegateObject, additionalData: additionalData) containerHelper.set(with: json, for: molecule)
// This molecule will by default handle margins.
if let castView = molecule as? MVMCoreUIViewConstrainingProtocol {
castView.shouldSetHorizontalMargins?(false)
castView.shouldSetVerticalMargins?(false)
}
} }
public func reset() { public func reset() {
@ -237,11 +243,13 @@ import UIKit
var queue = [UIView]() var queue = [UIView]()
for view in views { // Reversed the array to first check views at the front.
for view in views.reversed() {
// Only one Label will have a hero in a table cell. // Only one Label will have a hero in a table cell.
if let label = view as? Label, label.hero != nil { if let label = view as? Label, label.hero != nil {
return label return label
} }
queue.append(contentsOf: view.subviews) queue.append(contentsOf: view.subviews)
} }

View File

@ -1,123 +0,0 @@
//
// MFTextFieldListView.swift
// MobileFirstFramework
//
// Created by Suresh, Kamlesh on 9/21/18.
// Copyright © 2018 Verizon Wireless. All rights reserved.
//
import UIKit
import MVMCore
public class MFTextFieldListView: ViewConstrainingView {
public var textFieldMapList: [[String: Any]]?
public var parentViewContoller: MFViewController?
public var textFieldsToValidate: [MFTextField] = []
public var textFields: [MFTextField] = []
public var primaryButton: PrimaryButton?
public init(textFieldMapList: [[String: Any]], parentViewContoller: MFViewController, primaryButton: PrimaryButton?) {
self.textFieldMapList = textFieldMapList
self.parentViewContoller = parentViewContoller
self.primaryButton = primaryButton
super.init(frame: .zero)
}
public required init?(coder decoder: NSCoder) {
super.init(coder: decoder)
}
public override func updateView(_ size: CGFloat) {
super.updateView(size)
for textField in textFields {
textField.updateView(size)
}
}
public override func setupView() {
super.setupView()
self.translatesAutoresizingMaskIntoConstraints = false
guard let textFieldMapList = textFieldMapList else {
return
}
var viewList: [UIView] = []
for textFieldMap in textFieldMapList {
if let textField = MFTextField(map: textFieldMap, bothDelegates: self) {
if textFieldMap.boolForKey("required") {
textFieldsToValidate.append(textField)
}
textFields.append(textField)
if let fieldKey = textField.fieldKey {
parentViewContoller?.register(textField, forErrorKey: fieldKey as String)
}
viewList.append(textField)
}
}
StackableViewController.populateView(self, withUIArray: viewList) { (viewObject) -> UIEdgeInsets in
var edgeInsets = StackableViewController.standardSpaceAroundUIObject()
edgeInsets.left = 0
edgeInsets.right = 0
edgeInsets.top = 0
return edgeInsets
}
primaryButton?.handleEnabling(with: textFieldsToValidate)
}
public func addParams(requestParameters: MVMCoreRequestParameters) {
requestParameters.add(getTextParamsList())
}
public func getTextParamsList() -> [String: Any] {
var extraParam: [String: Any] = [:]
for textField in textFields {
if let fieldKey = textField.fieldKey {
extraParam[fieldKey as String] = textField.text ?? ""
}
}
return extraParam
}
}
extension MFTextFieldListView: UITextFieldDelegate, UITextViewDelegate, MFTextFieldDelegate {
@objc open func textFieldDidEndEditing(_ textField: UITextField) {
parentViewContoller?.textFieldDidEndEditing(textField)
primaryButton?.handleEnabling(with: textFieldsToValidate)
}
@objc open func dismissFieldInput(_ sender: Any?) {
parentViewContoller?.dismissFieldInput(sender)
}
@objc open func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
@objc open func textFieldDidBeginEditing(_ textField: UITextField) {
parentViewContoller?.textFieldDidBeginEditing(textField)
}
@objc open func entryIsValid(_ textfield: MFTextField?) {
DispatchQueue.main.async {
if self.parentViewContoller?.responds(to: #selector(MFTextFieldDelegate.entryIsValid(_:))) ?? false {
self.parentViewContoller?.entryIsValid(textfield)
}
}
}
@objc open func entryIsInvalid(_ textfield: MFTextField?) {
DispatchQueue.main.async {
if self.parentViewContoller?.responds(to: #selector(MFTextFieldDelegate.entryIsInvalid(_:))) ?? false {
self.parentViewContoller?.entryIsInvalid(textfield)
}
}
}
}

View File

@ -8,13 +8,17 @@
import UIKit import UIKit
open class ModuleMolecule: ViewConstrainingView { struct ModuleMoleculeModel: ContainerModelProtocol {
var horizontalAlignment: UIStackView.Alignment? = .fill
open var moduleMolecule: (UIView & MVMCoreUIMoleculeViewProtocol)? var verticalAlignment: UIStackView.Alignment? = .fill
var useHorizontalMargins: Bool? = false
var useVerticalMargins: Bool? = false
}
open override func updateView(_ size: CGFloat) { open class ModuleMolecule: Container {
super.updateView(size) public override func setupView() {
moduleMolecule?.updateView(size) super.setupView()
model = ModuleMoleculeModel()
} }
// MARK: - MVMCoreUIMoleculeViewProtocol // MARK: - MVMCoreUIMoleculeViewProtocol
@ -26,35 +30,16 @@ open class ModuleMolecule: ViewConstrainingView {
return return
} }
if moduleMolecule == nil { if view == nil {
if let moleculeView = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(forJSON: module, delegateObject: delegateObject, constrainIfNeeded: true) { if let moleculeView = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(forJSON: module, delegateObject: delegateObject, constrainIfNeeded: false) {
addSubview(moleculeView) addAndContain(moleculeView)
NSLayoutConstraint.activate(Array(NSLayoutConstraint.pinView(toSuperview: moleculeView, useMargins: false).values))
moduleMolecule = moleculeView
isAccessibilityElement = false
if moleculeView.accessibilityElements != nil {
accessibilityElements = moleculeView.accessibilityElements
} else {
accessibilityElements = [moleculeView]
}
} }
} else { } else {
moduleMolecule?.setWithJSON(module, delegateObject: delegateObject, additionalData: additionalData) (view as? MVMCoreUIMoleculeViewProtocol)?.setWithJSON(module, delegateObject: delegateObject, additionalData: additionalData)
} }
} }
open override func setAsMolecule() { public class func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat {
super.setAsMolecule()
moduleMolecule?.setAsMolecule?()
}
open override func reset() {
super.reset()
moduleMolecule?.reset?()
}
public override class func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat {
guard let moduleName = json?.optionalStringForKey("moduleName"), let module = delegateObject?.moleculeDelegate?.getModuleWithName(moduleName) else { guard let moduleName = json?.optionalStringForKey("moduleName"), let module = delegateObject?.moleculeDelegate?.getModuleWithName(moduleName) else {
// Critical error // Critical error
return 0 return 0
@ -62,7 +47,7 @@ open class ModuleMolecule: ViewConstrainingView {
return MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(withJSON: module)?.estimatedHeight?(forRow: module, delegateObject: delegateObject) ?? 0 return MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(withJSON: module)?.estimatedHeight?(forRow: module, delegateObject: delegateObject) ?? 0
} }
public override class func name(forReuse molecule: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> String? { public class func name(forReuse molecule: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> String? {
guard let moduleName = molecule?.optionalStringForKey("moduleName"), let module = delegateObject?.moleculeDelegate?.getModuleWithName(moduleName) else { guard let moduleName = molecule?.optionalStringForKey("moduleName"), let module = delegateObject?.moleculeDelegate?.getModuleWithName(moduleName) else {
// Critical error // Critical error
return "moduleMolecule<>" return "moduleMolecule<>"
@ -70,7 +55,7 @@ open class ModuleMolecule: ViewConstrainingView {
return "moduleMolecule<" + (MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(withJSON: module)?.name?(forReuse: module, delegateObject: delegateObject) ?? module.stringForkey(KeyMoleculeName)) + ">" return "moduleMolecule<" + (MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(withJSON: module)?.name?(forReuse: module, delegateObject: delegateObject) ?? module.stringForkey(KeyMoleculeName)) + ">"
} }
public override class func requiredModules(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, error: AutoreleasingUnsafeMutablePointer<MVMCoreErrorObject?>?) -> [String]? { public class func requiredModules(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, error: AutoreleasingUnsafeMutablePointer<MVMCoreErrorObject?>?) -> [String]? {
let moduleName = json?.optionalStringForKey("moduleName") let moduleName = json?.optionalStringForKey("moduleName")
if moduleName == nil || delegateObject?.moleculeDelegate?.getModuleWithName(moduleName) == nil { if moduleName == nil || delegateObject?.moleculeDelegate?.getModuleWithName(moduleName) == nil {
if let errorObject = MVMCoreErrorObject(title: nil, message: MVMCoreGetterUtility.hardcodedString(withKey: HardcodedErrorUnableToProcess), code: CoreUIErrorCode.ErrorCodeModuleMolecule.rawValue, domain: ErrorDomainNative, location: String(describing: self)) { if let errorObject = MVMCoreErrorObject(title: nil, message: MVMCoreGetterUtility.hardcodedString(withKey: HardcodedErrorUnableToProcess), code: CoreUIErrorCode.ErrorCodeModuleMolecule.rawValue, domain: ErrorDomainNative, location: String(describing: self)) {
@ -83,25 +68,4 @@ open class ModuleMolecule: ViewConstrainingView {
} }
return nil return nil
} }
// MARK: - MVMCoreUIViewConstrainingProtocol
open override func useStandardConstraints() -> Bool {
return (moduleMolecule as? MVMCoreUIViewConstrainingProtocol)?.useStandardConstraints?() ?? true
}
open override func alignHorizontal(_ alignment: UIStackView.Alignment) {
(moduleMolecule as? MVMCoreUIViewConstrainingProtocol)?.alignHorizontal?(alignment)
}
open override func alignVertical(_ alignment: UIStackView.Alignment) {
(moduleMolecule as? MVMCoreUIViewConstrainingProtocol)?.alignVertical?(alignment)
}
open override func shouldSetHorizontalMargins(_ shouldSet: Bool) {
(moduleMolecule as? MVMCoreUIViewConstrainingProtocol)?.shouldSetHorizontalMargins?(shouldSet)
}
open override func shouldSetVerticalMargins(_ shouldSet: Bool) {
(moduleMolecule as? MVMCoreUIViewConstrainingProtocol)?.shouldSetVerticalMargins?(shouldSet)
}
} }

View File

@ -0,0 +1,27 @@
//
// MoleculeContainer.swift
// MVMCoreUI
//
// Created by Scott Pfeil on 12/12/19.
// Copyright © 2019 Verizon Wireless. All rights reserved.
//
import UIKit
open class MoleculeContainer: Container {
override public func setWithJSON(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) {
guard let moleculeJSON = json?.optionalDictionaryForKey(KeyMolecule) else {
super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
return
}
if view == nil {
if let molecule = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(forJSON: moleculeJSON, delegateObject: delegateObject, constrainIfNeeded: false) {
addAndContain(molecule)
}
} else {
(view as? MVMCoreUIMoleculeViewProtocol)?.setWithJSON(moleculeJSON, delegateObject: delegateObject, additionalData: additionalData)
}
super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
}
}

View File

@ -8,28 +8,23 @@
import UIKit import UIKit
open class StandardFooterView: ViewConstrainingView { open class StandardFooterView: MoleculeContainer {
open override func setupView() { open override func setupView() {
super.setupView() super.setupView()
topMarginPadding = PaddingDefaultVerticalSpacing topMarginPadding = PaddingDefaultVerticalSpacing
bottomMarginPadding = PaddingDefaultVerticalSpacing bottomMarginPadding = PaddingDefaultVerticalSpacing
shouldSetupMoleculeFromJSON = true
updateViewVerticalDefaults = true
updateViewHorizontalDefaults = true
} }
open override func setWithJSON(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) { public class func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat {
super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
// This molecule will by default handle margins.
(molecule as? MVMCoreUIViewConstrainingProtocol)?.shouldSetHorizontalMargins?(false)
(molecule as? MVMCoreUIViewConstrainingProtocol)?.shouldSetVerticalMargins?(false)
}
public override class func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat {
if let moleculeJSON = json?.optionalDictionaryForKey(KeyMolecule), let height = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(withJSON: moleculeJSON)?.estimatedHeight?(forRow: moleculeJSON, delegateObject: delegateObject) { if let moleculeJSON = json?.optionalDictionaryForKey(KeyMolecule), let height = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(withJSON: moleculeJSON)?.estimatedHeight?(forRow: moleculeJSON, delegateObject: delegateObject) {
return height + PaddingDefaultVerticalSpacing + PaddingDefaultVerticalSpacing return height + PaddingDefaultVerticalSpacing + PaddingDefaultVerticalSpacing
} }
return 42 return 42
} }
open override func reset() {
super.reset()
topMarginPadding = PaddingDefaultVerticalSpacing
bottomMarginPadding = PaddingDefaultVerticalSpacing
}
} }

View File

@ -8,7 +8,7 @@
import UIKit import UIKit
public class StandardHeaderView: ViewConstrainingView { public class StandardHeaderView: MoleculeContainer {
var line: Line? var line: Line?
// MARK: - MVMCoreViewProtocol // MARK: - MVMCoreViewProtocol
@ -19,9 +19,6 @@ public class StandardHeaderView: ViewConstrainingView {
public override func setupView() { public override func setupView() {
super.setupView() super.setupView()
shouldSetupMoleculeFromJSON = true
updateViewVerticalDefaults = true
updateViewHorizontalDefaults = true
topMarginPadding = PaddingDefaultVerticalSpacing topMarginPadding = PaddingDefaultVerticalSpacing
bottomMarginPadding = PaddingDefaultVerticalSpacing bottomMarginPadding = PaddingDefaultVerticalSpacing
@ -38,11 +35,6 @@ public class StandardHeaderView: ViewConstrainingView {
// MARK: - MVMCoreUIMoleculeViewProtocol // MARK: - MVMCoreUIMoleculeViewProtocol
open override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { open override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
// This molecule will by default handle margins.
(molecule as? MVMCoreUIViewConstrainingProtocol)?.shouldSetHorizontalMargins?(false)
(molecule as? MVMCoreUIViewConstrainingProtocol)?.shouldSetVerticalMargins?(false)
if let separatorJSON = json?.optionalDictionaryForKey("separator") { if let separatorJSON = json?.optionalDictionaryForKey("separator") {
line?.setWithJSON(separatorJSON, delegateObject: delegateObject, additionalData: additionalData) line?.setWithJSON(separatorJSON, delegateObject: delegateObject, additionalData: additionalData)
} }
@ -50,12 +42,12 @@ public class StandardHeaderView: ViewConstrainingView {
open override func reset() { open override func reset() {
super.reset() super.reset()
line?.style = .heavy
topMarginPadding = PaddingDefaultVerticalSpacing topMarginPadding = PaddingDefaultVerticalSpacing
bottomMarginPadding = PaddingDefaultVerticalSpacing bottomMarginPadding = PaddingDefaultVerticalSpacing
line?.style = .heavy
} }
public override class func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { public class func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat {
if let moleculeJSON = json?.optionalDictionaryForKey(KeyMolecule), let height = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(withJSON: moleculeJSON)?.estimatedHeight?(forRow: moleculeJSON, delegateObject: delegateObject) { if let moleculeJSON = json?.optionalDictionaryForKey(KeyMolecule), let height = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(withJSON: moleculeJSON)?.estimatedHeight?(forRow: moleculeJSON, delegateObject: delegateObject) {
return height + PaddingDefaultVerticalSpacing + PaddingDefaultVerticalSpacing return height + PaddingDefaultVerticalSpacing + PaddingDefaultVerticalSpacing
} }

View File

@ -22,15 +22,14 @@ import UIKit
return return
} }
stack.spacing = 0 stack.spacing = 0
stack.updateViewHorizontalDefaults = false
addSubview(stack) addSubview(stack)
pinView(toSuperView: stack) pinView(toSuperView: stack)
stack.addStackItem(StackItem(with: eyebrow), lastItem: false) stack.addStackItem(StackItemModel(with: StackItem(andContain: eyebrow)), lastItem: false)
stack.addStackItem(StackItem(with: headline), lastItem: false) stack.addStackItem(StackItemModel(with: StackItem(andContain: headline)), lastItem: false)
stack.addStackItem(StackItem(with: body), lastItem: false) stack.addStackItem(StackItemModel(with: StackItem(andContain: body)), lastItem: false)
// To visually take into account the extra padding in the intrinsic content of a button. // To visually take into account the extra padding in the intrinsic content of a button.
let stackItem = StackItem(with: link) let stackItem = StackItemModel(with: StackItem(andContain: link))
stackItem.spacing = -6 stackItem.spacing = -6
stack.addStackItem(stackItem, lastItem: true) stack.addStackItem(stackItem, lastItem: true)
} }
@ -58,7 +57,6 @@ import UIKit
super.reset() super.reset()
stack.reset() stack.reset()
stack.spacing = 0 stack.spacing = 0
stack.updateViewHorizontalDefaults = false
eyebrow.styleB3(true) eyebrow.styleB3(true)
headline.styleB1(true) headline.styleB1(true)
body.styleB2(true) body.styleB2(true)

View File

@ -0,0 +1,84 @@
//
// HeadLineBodyCaretLinkImage.swift
// MVMCoreUI
//
// Created by Arora, Prateek on 06/01/20.
// Copyright © 2020 Verizon Wireless. All rights reserved.
//
import Foundation
@objcMembers public class HeadLineBodyCaretLinkImage: ViewConstrainingView {
let headlineBody = HeadlineBody(frame: .zero)
let caretButton = CaretButton(frame: .zero)
let backgroundImageView = MFLoadImageView()
var spaceBetweenConstant: CGFloat = 104.0
var leftConstraintHeadline : NSLayoutConstraint?
var leftConstraintCaretView : NSLayoutConstraint?
let padding = MFStyler.defaultHorizontalPaddingForApplicationWidth()
let maxWidth : CGFloat = 350.0
// MARK: - MVMCoreViewProtocol
open override func updateView(_ size: CGFloat) {
super.updateView(size)
headlineBody.updateView(size)
caretButton.updateView(size)
backgroundImageView.updateView(size)
leftConstraintHeadline?.constant = MFStyler.defaultHorizontalPadding(forSize: size)
leftConstraintCaretView?.constant = MFStyler.defaultHorizontalPadding(forSize: size)
}
open override func setupView() {
super.setupView()
guard subviews.count == 0 else {
return
}
let view = MVMCoreUICommonViewsUtility.commonView()
addSubview(view)
pinView(toSuperView: view)
view.addSubview(headlineBody)
view.addSubview(caretButton)
//Headline view
leftConstraintHeadline = headlineBody.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: padding)
leftConstraintHeadline?.isActive = true
headlineBody.topAnchor.constraint(equalTo: view.topAnchor, constant: PaddingDefault).isActive = true
let headLineBodyWidth = headlineBody.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.85)
headLineBodyWidth.priority = .defaultHigh
headLineBodyWidth.isActive = true
headlineBody.widthAnchor.constraint(lessThanOrEqualToConstant: maxWidth).isActive = true
//Caret view
caretButton.translatesAutoresizingMaskIntoConstraints = false
leftConstraintCaretView = caretButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: padding)
leftConstraintCaretView?.isActive = true
view.bottomAnchor.constraint(equalTo: caretButton.bottomAnchor, constant: PaddingDefault).isActive = true
caretButton.topAnchor.constraint(greaterThanOrEqualTo: headlineBody.bottomAnchor, constant: spaceBetweenConstant).isActive = true
//Background image view
backgroundImageView.translatesAutoresizingMaskIntoConstraints = false
backgroundImageView.imageView.contentMode = .scaleAspectFill
view.addSubview(backgroundImageView)
NSLayoutConstraint.constraintPinSubview(toSuperview: backgroundImageView)
view.sendSubviewToBack(backgroundImageView)
}
// MARK: - MVMCoreUIMoleculeViewProtocol
open override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
backgroundImageView.setWithJSON(json?.optionalDictionaryForKey("image"), delegateObject: delegateObject, additionalData: additionalData)
headlineBody.setWithJSON(json?.optionalDictionaryForKey("headlineBody"), delegateObject: delegateObject, additionalData: additionalData)
caretButton.setWithJSON(json?.optionalDictionaryForKey("caretLink"), delegateObject: delegateObject, additionalData: additionalData)
}
open override func reset() {
super.reset()
headlineBody.reset()
backgroundImageView.reset()
}
public override class func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat {
return 320
}
}

View File

@ -8,47 +8,13 @@
import UIKit import UIKit
public class StackItem { open class MoleculeStackView: Container {
var view: UIView
var spacing: CGFloat?
var percentage: Int?
var verticalAlignment: UIStackView.Alignment?
var horizontalAlignment: UIStackView.Alignment?
var gone = false
init(with view: UIView) {
self.view = view
}
init(with view: UIView, json: [AnyHashable: Any]?) {
self.view = view
update(with: json)
}
func update(with json: [AnyHashable: Any]?) {
gone = json?.boolForKey("gone") ?? (json == nil)
spacing = json?.optionalCGFloatForKey("spacing")
percentage = json?["percent"] as? Int
if let alignment = json?.stringOptionalWithChainOfKeysOrIndexes([KeyMolecule,"verticalAlignment"]) {
verticalAlignment = ViewConstrainingView.getAlignmentFor(alignment, defaultAlignment: .fill)
} else {
verticalAlignment = nil
}
if let alignment = json?.stringOptionalWithChainOfKeysOrIndexes([KeyMolecule,"horizontalAlignment"]) {
horizontalAlignment = ViewConstrainingView.getAlignmentFor(alignment, defaultAlignment: .fill)
} else {
horizontalAlignment = nil
}
}
}
public class MoleculeStackView: ViewConstrainingView {
var contentView: UIView = MVMCoreUICommonViewsUtility.commonView() var contentView: UIView = MVMCoreUICommonViewsUtility.commonView()
var items: [StackItem] = [] var items: [StackItemModel] = []
var useStackSpacingBeforeFirstItem = false var useStackSpacingBeforeFirstItem = false
private var moleculesShouldSetHorizontalMargins = false var moleculesShouldSetHorizontalMargins = false
private var moleculesShouldSetVerticalMargins = false var moleculesShouldSetVerticalMargins = false
/// For setting the direction of the stack /// For setting the direction of the stack
var axis: NSLayoutConstraint.Axis = .vertical { var axis: NSLayoutConstraint.Axis = .vertical {
@ -97,6 +63,10 @@ public class MoleculeStackView: ViewConstrainingView {
} }
// MARK: - Inits // MARK: - Inits
public override init() {
super.init()
}
public override init(frame: CGRect) { public override init(frame: CGRect) {
super.init(frame: frame) super.init(frame: frame)
} }
@ -117,19 +87,20 @@ public class MoleculeStackView: ViewConstrainingView {
return return
} }
MVMCoreUIUtility.setMarginsFor(contentView, leading: 0, top: 0, trailing: 0, bottom: 0) MVMCoreUIUtility.setMarginsFor(contentView, leading: 0, top: 0, trailing: 0, bottom: 0)
updateViewHorizontalDefaults = true
translatesAutoresizingMaskIntoConstraints = false translatesAutoresizingMaskIntoConstraints = false
backgroundColor = .clear backgroundColor = .clear
addSubview(contentView) addSubview(contentView)
pinView(toSuperView: contentView) containerHelper.constrainView(contentView)
contentView.setContentHuggingPriority(.defaultHigh, for: .vertical) contentView.setContentHuggingPriority(.defaultHigh, for: .vertical)
contentView.setContentHuggingPriority(.defaultHigh, for: .horizontal) contentView.setContentHuggingPriority(.defaultHigh, for: .horizontal)
} }
public override func updateView(_ size: CGFloat) { public override func updateView(_ size: CGFloat) {
super.updateView(size) super.updateView(size)
directionalLayoutMargins.leading = 0
directionalLayoutMargins.trailing = 0
for item in items { for item in items {
(item.view as? MVMCoreViewProtocol)?.updateView(size) item.view.updateView(size)
} }
} }
@ -137,11 +108,8 @@ public class MoleculeStackView: ViewConstrainingView {
public override func reset() { public override func reset() {
super.reset() super.reset()
backgroundColor = .clear backgroundColor = .clear
updateViewHorizontalDefaults = true
for item in items { for item in items {
if let view = item.view as? MVMCoreUIMoleculeViewProtocol { item.view.reset()
view.reset?()
}
} }
} }
@ -151,7 +119,7 @@ public class MoleculeStackView: ViewConstrainingView {
removeAllItemViews() removeAllItemViews()
// If the items in the stack are the same, just update previous items instead of re-allocating. // If the items in the stack are the same, just update previous items instead of re-allocating.
var items: [StackItem]? var items: [StackItemModel]?
if MoleculeStackView.name(forReuse: previousJSON, delegateObject: delegateObject) == MoleculeStackView.name(forReuse: json, delegateObject: delegateObject) { if MoleculeStackView.name(forReuse: previousJSON, delegateObject: delegateObject) == MoleculeStackView.name(forReuse: json, delegateObject: delegateObject) {
items = self.items items = self.items
} }
@ -167,24 +135,28 @@ public class MoleculeStackView: ViewConstrainingView {
// Adds the molecules and sets the json. // Adds the molecules and sets the json.
for (index, map) in molecules.enumerated() { for (index, map) in molecules.enumerated() {
if let moleculeJSON = map.optionalDictionaryForKey(KeyMolecule) { var view: UIView?
var view: UIView? var stackItemModel: StackItemModel
if let item = items?[index] { if let item = items?[index] {
item.update(with: map) stackItemModel = item
view = item.view item.update(with: map)
(view as? MVMCoreUIMoleculeViewProtocol)?.setWithJSON(moleculeJSON, delegateObject: delegateObject, additionalData: nil) view = item.view
addStackItem(item, lastItem: index == molecules.count - 1) (view as? MVMCoreUIMoleculeViewProtocol)?.setWithJSON(map, delegateObject: delegateObject, additionalData: nil)
} else if let molecule = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(forJSON: moleculeJSON, delegateObject: delegateObject, constrainIfNeeded: true) { addStackItem(item, lastItem: index == molecules.count - 1)
view = molecule } else {
addStackItem(StackItem(with: molecule, json: map), lastItem: index == molecules.count - 1) let stackItem = StackItem()
} stackItem.setWithJSON(map, delegateObject: delegateObject, additionalData: additionalData)
(view as? MVMCoreUIViewConstrainingProtocol)?.shouldSetHorizontalMargins?(moleculesShouldSetHorizontalMargins) view = stackItem
(view as? MVMCoreUIViewConstrainingProtocol)?.shouldSetVerticalMargins?(moleculesShouldSetVerticalMargins) stackItemModel = StackItemModel(with: stackItem, json: map)
addStackItem(stackItemModel, lastItem: index == molecules.count - 1)
} }
stackItemModel.useHorizontalMargins = moleculesShouldSetHorizontalMargins
stackItemModel.useVerticalMargins = moleculesShouldSetVerticalMargins
} }
} }
public override class func name(forReuse molecule: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> String? { public class func name(forReuse molecule: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> String? {
// This will aggregate names of molecules to make an id. // This will aggregate names of molecules to make an id.
guard let molecules = molecule?.optionalArrayForKey(KeyMolecules) else { guard let molecules = molecule?.optionalArrayForKey(KeyMolecules) else {
return "stack<>" return "stack<>"
@ -199,7 +171,7 @@ public class MoleculeStackView: ViewConstrainingView {
return name return name
} }
public override class func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { public class func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat {
guard let items = json?.optionalArrayForKey(KeyMolecules) else { guard let items = json?.optionalArrayForKey(KeyMolecules) else {
return 0 return 0
} }
@ -221,7 +193,7 @@ public class MoleculeStackView: ViewConstrainingView {
return estimatedHeight return estimatedHeight
} }
public override class func requiredModules(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, error: AutoreleasingUnsafeMutablePointer<MVMCoreErrorObject?>?) -> [String]? { public class func requiredModules(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, error: AutoreleasingUnsafeMutablePointer<MVMCoreErrorObject?>?) -> [String]? {
guard let items = json?.optionalArrayForKey(KeyMolecules) else { guard let items = json?.optionalArrayForKey(KeyMolecules) else {
return nil return nil
} }
@ -237,11 +209,11 @@ public class MoleculeStackView: ViewConstrainingView {
// MARK: - Adding to stack // MARK: - Adding to stack
/// Adds the view to the stack. /// Adds the view to the stack.
func addView(_ view: UIView, lastItem: Bool) { func addView(_ view: UIView, lastItem: Bool) {
addStackItem(StackItem(with: view), lastItem: lastItem) addStackItem(StackItemModel(with: StackItem(andContain: view)), lastItem: lastItem)
} }
/// Adds the stack item to the stack. /// Adds the stack item to the stack.
func addStackItem(_ stackItem: StackItem, lastItem: Bool) { func addStackItem(_ stackItem: StackItemModel, lastItem: Bool) {
guard !stackItem.gone else { guard !stackItem.gone else {
items.append(stackItem) items.append(stackItem)
return return
@ -251,12 +223,11 @@ public class MoleculeStackView: ViewConstrainingView {
view.translatesAutoresizingMaskIntoConstraints = false view.translatesAutoresizingMaskIntoConstraints = false
let spacing = stackItem.spacing ?? self.spacing let spacing = stackItem.spacing ?? self.spacing
if let view = view as? MVMCoreUIViewConstrainingProtocol { let verticalAlignment = stackItem.verticalAlignment ?? (stackItem.percentage == nil && axis == .vertical ? .fill : (axis == .vertical ? .leading : .center))
let verticalAlignment = stackItem.verticalAlignment ?? (stackItem.percentage == nil && axis == .vertical ? .fill : (axis == .vertical ? .leading : .center)) let horizontalAlignment = stackItem.horizontalAlignment ?? (view.view as? MVMCoreUIViewConstrainingProtocol)?.horizontalAlignment?() ?? (axis == .vertical || stackItem.percentage == nil ? .fill : .leading)
let horizontalAlignment = stackItem.horizontalAlignment ?? view.alignment?() ?? (axis == .vertical || stackItem.percentage == nil ? .fill : .leading) view.containerHelper.alignHorizontal(horizontalAlignment)
view.alignHorizontal?(horizontalAlignment) view.containerHelper.alignVertical(verticalAlignment)
view.alignVertical?(verticalAlignment)
}
let first = items.first { !$0.gone } == nil let first = items.first { !$0.gone } == nil
if axis == .vertical { if axis == .vertical {
if first { if first {
@ -264,7 +235,7 @@ public class MoleculeStackView: ViewConstrainingView {
} else if let previousView = items.last(where: { stackItem in } else if let previousView = items.last(where: { stackItem in
return !stackItem.gone return !stackItem.gone
})?.view { })?.view {
_ = NSLayoutConstraint(pinFirstView: previousView, toSecondView: view, withConstant: spacing, directionVertical: true) view.topAnchor.constraint(equalTo: previousView.bottomAnchor, constant: spacing).isActive = true
} }
pinView(view, toView: contentView, attribute: .leading, relation: .equal, priority: .required, constant: 0) pinView(view, toView: contentView, attribute: .leading, relation: .equal, priority: .required, constant: 0)
pinView(contentView, toView: view, attribute: .trailing, relation: .equal, priority: .required, constant: 0) pinView(contentView, toView: view, attribute: .trailing, relation: .equal, priority: .required, constant: 0)
@ -281,7 +252,7 @@ public class MoleculeStackView: ViewConstrainingView {
} else if let previousView = items.last(where: { stackItem in } else if let previousView = items.last(where: { stackItem in
return !stackItem.gone return !stackItem.gone
})?.view { })?.view {
_ = NSLayoutConstraint(pinFirstView: previousView, toSecondView: view, withConstant: spacing, directionVertical: false) view.leftAnchor.constraint(equalTo: previousView.rightAnchor, constant: spacing).isActive = true
} }
pinView(view, toView: contentView, attribute: .top, relation: .equal, priority: .required, constant: 0) pinView(view, toView: contentView, attribute: .top, relation: .equal, priority: .required, constant: 0)
pinView(contentView, toView: view, attribute: .bottom, relation: .equal, priority: .required, constant: 0) pinView(contentView, toView: view, attribute: .bottom, relation: .equal, priority: .required, constant: 0)
@ -295,10 +266,10 @@ public class MoleculeStackView: ViewConstrainingView {
items.append(stackItem) items.append(stackItem)
} }
func setWithStackItems(_ items: [StackItem]) { func setWithStackItems(_ items: [StackItemModel]) {
removeAllItemViews() removeAllItemViews()
self.items.removeAll() self.items.removeAll()
var previousPresentItem: StackItem? = nil var previousPresentItem: StackItemModel? = nil
for item in items { for item in items {
if !item.gone { if !item.gone {
previousPresentItem = item previousPresentItem = item

View File

@ -27,7 +27,7 @@
mapping = [@{ mapping = [@{
@"label": Label.class, @"label": Label.class,
@"line": Line.class, @"line": Line.class,
@"button": ButtonView.class, @"button": PrimaryButton.class,
@"textButton": MFTextButton.class, @"textButton": MFTextButton.class,
@"header": StandardHeaderView.class, @"header": StandardHeaderView.class,
@"moleculeStack": MoleculeStackView.class, @"moleculeStack": MoleculeStackView.class,
@ -35,10 +35,11 @@
@"footer": StandardFooterView.class, @"footer": StandardFooterView.class,
@"caretView": CaretView.class, @"caretView": CaretView.class,
@"caretButton": CaretButton.class, @"caretButton": CaretButton.class,
@"textField" : MFTextField.class, @"textField": MFTextField.class,
@"digitTextField" : MFDigitTextField.class, @"dropDown": DropDown.class,
@"checkbox" : Checkbox.class, @"digitTextField": MFDigitTextField.class,
@"checkboxWithLabel" : CheckboxWithLabelView.class, @"checkbox": Checkbox.class,
@"checkboxWithLabel": CheckboxWithLabelView.class,
@"cornerLabels" : CornerLabels.class, @"cornerLabels" : CornerLabels.class,
@"progressbar": ProgressBar.class, @"progressbar": ProgressBar.class,
@"circleProgress": GraphView.class, @"circleProgress": GraphView.class,
@ -63,8 +64,10 @@
@"headlineBodyTextButton": HeadlineBodyTextButton.class, @"headlineBodyTextButton": HeadlineBodyTextButton.class,
@"headlineBodyTextButtonSwitch": HeadlineBodyTextButtonSwitch.class, @"headlineBodyTextButtonSwitch": HeadlineBodyTextButtonSwitch.class,
@"tabsListItem": TabsTableViewCell.class, @"tabsListItem": TabsTableViewCell.class,
@"dropDownListItem": DropDownFilterTableViewCell.class,
@"headlineBodyButton": HeadlineBodyButton.class, @"headlineBodyButton": HeadlineBodyButton.class,
@"eyebrowHeadlineBodyLink": EyebrowHeadlineBodyLink.class @"eyebrowHeadlineBodyLink": EyebrowHeadlineBodyLink.class,
@"headLineBodyCaretLinkImage" : HeadLineBodyCaretLinkImage.class
} mutableCopy]; } mutableCopy];
}); });
return mapping; return mapping;

View File

@ -16,7 +16,13 @@
- (BOOL)needsToBeConstrained; - (BOOL)needsToBeConstrained;
/// The alignment if constrained. /// The alignment if constrained.
- (UIStackViewAlignment)alignment; - (UIStackViewAlignment)alignment __deprecated;
/// The alignment if constrained.
- (UIStackViewAlignment)horizontalAlignment;
/// The alignment if constrained.
- (UIStackViewAlignment)verticalAlignment;
/// Can be used to override any standard constraints that may be added. /// Can be used to override any standard constraints that may be added.
- (BOOL)useStandardConstraints; - (BOOL)useStandardConstraints;

View File

@ -19,7 +19,6 @@
static NSMutableDictionary *viewControllerMapping; static NSMutableDictionary *viewControllerMapping;
dispatch_once(&onceToken, ^{ dispatch_once(&onceToken, ^{
viewControllerMapping = [@{ viewControllerMapping = [@{
@"textFieldListForm" : [[MVMCoreViewControllerProgrammaticMappingObject alloc] initWithClass:[TextFieldListFormViewController class]],
@"moleculeStack" : [[MVMCoreViewControllerProgrammaticMappingObject alloc] initWithClass:[MoleculeStackTemplate class]], @"moleculeStack" : [[MVMCoreViewControllerProgrammaticMappingObject alloc] initWithClass:[MoleculeStackTemplate class]],
@"centerMoleculeStack" : [[MVMCoreViewControllerProgrammaticMappingObject alloc] initWithClass:[MoleculeStackCenteredTemplate class]], @"centerMoleculeStack" : [[MVMCoreViewControllerProgrammaticMappingObject alloc] initWithClass:[MoleculeStackCenteredTemplate class]],
@"moleculeList" : [[MVMCoreViewControllerProgrammaticMappingObject alloc] initWithClass:[MoleculeListTemplate class]], @"moleculeList" : [[MVMCoreViewControllerProgrammaticMappingObject alloc] initWithClass:[MoleculeListTemplate class]],

View File

@ -210,6 +210,7 @@ B3 -> Legal
/// Will style the label based on the string. Accepted values, H1, H2, H3, H32, B1, B2, B3, B20 /// Will style the label based on the string. Accepted values, H1, H2, H3, H32, B1, B2, B3, B20
+ (void)styleLabel:(nonnull UILabel *)label withStyle:(nullable NSString *)style; + (void)styleLabel:(nonnull UILabel *)label withStyle:(nullable NSString *)style;
+ (void)styleLabel:(nonnull UILabel *)label withStyle:(nullable NSString *)style genericScaling:(BOOL)genericScaling;
+ (void)styleLabelH1:(nonnull UILabel *)label genericScaling:(BOOL)genericScaling; + (void)styleLabelH1:(nonnull UILabel *)label genericScaling:(BOOL)genericScaling;
+ (void)styleLabelH1:(nonnull UILabel *)label; + (void)styleLabelH1:(nonnull UILabel *)label;
@ -258,6 +259,7 @@ B3 -> Legal
/// Will style the string based on the string. Accepted values, H1, H2, H3, H32, B1, B2, B3, B20 /// Will style the string based on the string. Accepted values, H1, H2, H3, H32, B1, B2, B3, B20
+ (nonnull NSAttributedString *)styleGetAttributedString:(nullable NSString *)string withStyle:(nullable NSString *)style; + (nonnull NSAttributedString *)styleGetAttributedString:(nullable NSString *)string withStyle:(nullable NSString *)style;
+ (nonnull NSAttributedString *)styleGetAttributedString:(nullable NSString *)string withStyle:(nullable NSString *)style genericScaling:(BOOL)genericScaling;
+ (nonnull NSAttributedString *)styleGetAttributedString:(nullable NSString *)string font:(nonnull UIFont *)font color:(nonnull UIColor *)color; + (nonnull NSAttributedString *)styleGetAttributedString:(nullable NSString *)string font:(nonnull UIFont *)font color:(nonnull UIColor *)color;
+ (nonnull NSAttributedString *)styleGetH1AttributedString:(nullable NSString *)string; + (nonnull NSAttributedString *)styleGetH1AttributedString:(nullable NSString *)string;
@ -266,6 +268,14 @@ B3 -> Legal
+ (nonnull NSAttributedString *)styleGetB1AttributedString:(nullable NSString *)string; + (nonnull NSAttributedString *)styleGetB1AttributedString:(nullable NSString *)string;
+ (nonnull NSAttributedString *)styleGetB2AttributedString:(nullable NSString *)string; + (nonnull NSAttributedString *)styleGetB2AttributedString:(nullable NSString *)string;
+ (nonnull NSAttributedString *)styleGetB3AttributedString:(nullable NSString *)string; + (nonnull NSAttributedString *)styleGetB3AttributedString:(nullable NSString *)string;
+ (nonnull NSAttributedString *)styleGetH1AttributedString:(nullable NSString *)string genericScaling:(BOOL)genericScaling;
+ (nonnull NSAttributedString *)styleGetH2AttributedString:(nullable NSString *)string genericScaling:(BOOL)genericScaling;
+ (nonnull NSAttributedString *)styleGetH3AttributedString:(nullable NSString *)string genericScaling:(BOOL)genericScaling;
+ (nonnull NSAttributedString *)styleGetH32AttributedString:(nullable NSString *)string genericScaling:(BOOL)genericScaling;
+ (nonnull NSAttributedString *)styleGetB1AttributedString:(nullable NSString *)string genericScaling:(BOOL)genericScaling;
+ (nonnull NSAttributedString *)styleGetB2AttributedString:(nullable NSString *)string genericScaling:(BOOL)genericScaling;
+ (nonnull NSAttributedString *)styleGetB3AttributedString:(nullable NSString *)string genericScaling:(BOOL)genericScaling;
+ (nonnull NSAttributedString *)styleGetB20AttributedString:(nullable NSString *)string genericScaling:(BOOL)genericScaling;
+ (nonnull NSAttributedString *)styleGetDisabledB2AttributedString:(nullable NSString *)string; + (nonnull NSAttributedString *)styleGetDisabledB2AttributedString:(nullable NSString *)string;
+ (nonnull NSAttributedString *)styleGetDisabledB1AttributedString:(nullable NSString *)string; + (nonnull NSAttributedString *)styleGetDisabledB1AttributedString:(nullable NSString *)string;

View File

@ -516,26 +516,30 @@ CGFloat const LabelWithInternalButtonLineSpace = 2;
#pragma mark - 2.0 Styles #pragma mark - 2.0 Styles
+ (void)styleLabel:(nonnull UILabel *)label withStyle:(nullable NSString *)style { + (void)styleLabel:(nonnull UILabel *)label withStyle:(nullable NSString *)style genericScaling:(BOOL)genericScaling {
if ([style isEqualToString:@"H1"]) { if ([style isEqualToString:@"H1"]) {
[self styleLabelH1:label]; [self styleLabelH1:label genericScaling:genericScaling];
} else if ([style isEqualToString:@"H2"]) { } else if ([style isEqualToString:@"H2"]) {
[self styleLabelH2:label]; [self styleLabelH2:label genericScaling:genericScaling];
} else if ([style isEqualToString:@"H3"]) { } else if ([style isEqualToString:@"H3"]) {
[self styleLabelH3:label]; [self styleLabelH3:label genericScaling:genericScaling];
} else if ([style isEqualToString:@"H32"]) { } else if ([style isEqualToString:@"H32"]) {
[self styleLabelH32:label]; [self styleLabelH32:label genericScaling:genericScaling];
} else if ([style isEqualToString:@"B1"]) { } else if ([style isEqualToString:@"B1"]) {
[self styleLabelB1:label]; [self styleLabelB1:label genericScaling:genericScaling];
} else if ([style isEqualToString:@"B3"]) { } else if ([style isEqualToString:@"B3"]) {
[self styleLabelB3:label]; [self styleLabelB3:label genericScaling:genericScaling];
} else if ([style isEqualToString:@"B20"]) { } else if ([style isEqualToString:@"B20"]) {
[self styleLabelB20:label]; [self styleLabelB20:label genericScaling:genericScaling];
} else { } else {
[self styleLabelB2:label]; [self styleLabelB2:label genericScaling:genericScaling];
} }
} }
+ (void)styleLabel:(nonnull UILabel *)label withStyle:(nullable NSString *)style {
[self styleLabel:label withStyle:style genericScaling:YES];
}
+ (void)styleLabelH1:(nonnull UILabel *)label genericScaling:(BOOL)genericScaling { + (void)styleLabelH1:(nonnull UILabel *)label genericScaling:(BOOL)genericScaling {
label.font = [MFStyler fontH1:genericScaling]; label.font = [MFStyler fontH1:genericScaling];
label.textColor = [UIColor blackColor]; label.textColor = [UIColor blackColor];
@ -656,22 +660,26 @@ CGFloat const LabelWithInternalButtonLineSpace = 2;
#pragma mark - Attributed Strings #pragma mark - Attributed Strings
+ (nonnull NSAttributedString *)styleGetAttributedString:(nullable NSString *)string withStyle:(nullable NSString *)style { + (nonnull NSAttributedString *)styleGetAttributedString:(nullable NSString *)string withStyle:(nullable NSString *)style {
return [self styleGetAttributedString:string withStyle:style genericScaling:YES];
}
+ (nonnull NSAttributedString *)styleGetAttributedString:(nullable NSString *)string withStyle:(nullable NSString *)style genericScaling:(BOOL)genericScaling {
if ([style isEqualToString:@"H1"]) { if ([style isEqualToString:@"H1"]) {
return [self styleGetH1AttributedString:string]; return [self styleGetH1AttributedString:string genericScaling:genericScaling];
} else if ([style isEqualToString:@"H2"]) { } else if ([style isEqualToString:@"H2"]) {
return [self styleGetH2AttributedString:string]; return [self styleGetH2AttributedString:string genericScaling:genericScaling];
} else if ([style isEqualToString:@"H3"]) { } else if ([style isEqualToString:@"H3"]) {
return [self styleGetH3AttributedString:string]; return [self styleGetH3AttributedString:string genericScaling:genericScaling];
} else if ([style isEqualToString:@"H32"]) { } else if ([style isEqualToString:@"H32"]) {
return [self styleGetH32AttributedString:string]; return [self styleGetH32AttributedString:string genericScaling:genericScaling];
} else if ([style isEqualToString:@"B1"]) { } else if ([style isEqualToString:@"B1"]) {
return [self styleGetB1AttributedString:string]; return [self styleGetB1AttributedString:string genericScaling:genericScaling];
} else if ([style isEqualToString:@"B3"]) { } else if ([style isEqualToString:@"B3"]) {
return [self styleGetB3AttributedString:string]; return [self styleGetB3AttributedString:string genericScaling:genericScaling];
} else if ([style isEqualToString:@"B20"]) { } else if ([style isEqualToString:@"B20"]) {
return [self styleGetB20AttributedString:string]; return [self styleGetB20AttributedString:string genericScaling:genericScaling];
} else { } else {
return [self styleGetB2AttributedString:string]; return [self styleGetB2AttributedString:string genericScaling:genericScaling];
} }
} }
@ -690,35 +698,67 @@ CGFloat const LabelWithInternalButtonLineSpace = 2;
} }
+ (nonnull NSAttributedString *)styleGetH1AttributedString:(nullable NSString *)string { + (nonnull NSAttributedString *)styleGetH1AttributedString:(nullable NSString *)string {
return [MFStyler styleGetAttributedString:string font:[MFStyler fontH1] color:[UIColor blackColor]]; return [MFStyler styleGetH1AttributedString:string genericScaling:YES];
}
+ (nonnull NSAttributedString *)styleGetH1AttributedString:(nullable NSString *)string genericScaling:(BOOL)genericScaling {
return [MFStyler styleGetAttributedString:string font:[MFStyler fontH1:genericScaling] color:[UIColor blackColor]];
} }
+ (nonnull NSAttributedString *)styleGetH2AttributedString:(nullable NSString *)string { + (nonnull NSAttributedString *)styleGetH2AttributedString:(nullable NSString *)string {
return [MFStyler styleGetAttributedString:string font:[MFStyler fontH2] color:[UIColor blackColor]]; return [MFStyler styleGetH2AttributedString:string genericScaling:YES];
}
+ (nonnull NSAttributedString *)styleGetH2AttributedString:(nullable NSString *)string genericScaling:(BOOL)genericScaling {
return [MFStyler styleGetAttributedString:string font:[MFStyler fontH2:genericScaling] color:[UIColor blackColor]];
} }
+ (nonnull NSAttributedString *)styleGetH3AttributedString:(nullable NSString *)string { + (nonnull NSAttributedString *)styleGetH3AttributedString:(nullable NSString *)string {
return [MFStyler styleGetAttributedString:string font:[MFStyler fontH3] color:[UIColor blackColor]]; return [MFStyler styleGetH3AttributedString:string genericScaling:YES];
}
+ (nonnull NSAttributedString *)styleGetH3AttributedString:(nullable NSString *)string genericScaling:(BOOL)genericScaling {
return [MFStyler styleGetAttributedString:string font:[MFStyler fontH3:genericScaling] color:[UIColor blackColor]];
} }
+ (nonnull NSAttributedString *)styleGetH32AttributedString:(nullable NSString *)string { + (nonnull NSAttributedString *)styleGetH32AttributedString:(nullable NSString *)string {
return [MFStyler styleGetAttributedString:string font:[MFStyler fontH32] color:[UIColor blackColor]]; return [MFStyler styleGetH32AttributedString:string genericScaling:YES];
}
+ (nonnull NSAttributedString *)styleGetH32AttributedString:(nullable NSString *)string genericScaling:(BOOL)genericScaling {
return [MFStyler styleGetAttributedString:string font:[MFStyler fontH32:genericScaling] color:[UIColor blackColor]];
} }
+ (nonnull NSAttributedString *)styleGetB1AttributedString:(nullable NSString *)string { + (nonnull NSAttributedString *)styleGetB1AttributedString:(nullable NSString *)string {
return [MFStyler styleGetAttributedString:string font:[MFStyler fontB1] color:[UIColor blackColor]]; return [MFStyler styleGetB1AttributedString:string genericScaling:YES];
}
+ (nonnull NSAttributedString *)styleGetB1AttributedString:(nullable NSString *)string genericScaling:(BOOL)genericScaling {
return [MFStyler styleGetAttributedString:string font:[MFStyler fontB1:genericScaling] color:[UIColor blackColor]];
} }
+ (nonnull NSAttributedString *)styleGetB2AttributedString:(nullable NSString *)string { + (nonnull NSAttributedString *)styleGetB2AttributedString:(nullable NSString *)string {
return [MFStyler styleGetAttributedString:string font:[MFStyler fontB2] color:[UIColor blackColor]]; return [MFStyler styleGetB2AttributedString:string genericScaling:YES];
}
+ (nonnull NSAttributedString *)styleGetB2AttributedString:(nullable NSString *)string genericScaling:(BOOL)genericScaling {
return [MFStyler styleGetAttributedString:string font:[MFStyler fontB2:genericScaling] color:[UIColor blackColor]];
} }
+ (nonnull NSAttributedString *)styleGetB3AttributedString:(nullable NSString *)string { + (nonnull NSAttributedString *)styleGetB3AttributedString:(nullable NSString *)string {
return [MFStyler styleGetAttributedString:string font:[MFStyler fontB3] color:[UIColor mfBattleshipGrey]]; return [MFStyler styleGetB3AttributedString:string genericScaling:YES];
}
+ (nonnull NSAttributedString *)styleGetB3AttributedString:(nullable NSString *)string genericScaling:(BOOL)genericScaling {
return [MFStyler styleGetAttributedString:string font:[MFStyler fontB3:genericScaling] color:[UIColor mfBattleshipGrey]];
} }
+ (nonnull NSAttributedString *)styleGetB20AttributedString:(nullable NSString *)string { + (nonnull NSAttributedString *)styleGetB20AttributedString:(nullable NSString *)string {
return [MFStyler styleGetAttributedString:string font:[MFStyler fontB20] color:[UIColor blackColor]]; return [MFStyler styleGetB20AttributedString:string genericScaling:YES];
}
+ (nonnull NSAttributedString *)styleGetB20AttributedString:(nullable NSString *)string genericScaling:(BOOL)genericScaling {
return [MFStyler styleGetAttributedString:string font:[MFStyler fontB20:genericScaling] color:[UIColor blackColor]];
} }
+ (nonnull NSAttributedString *)styleGetDisabledB1AttributedString:(nullable NSString *)string { + (nonnull NSAttributedString *)styleGetDisabledB1AttributedString:(nullable NSString *)string {

View File

@ -42,6 +42,7 @@ open class MoleculeStackTemplate: ThreeLayerViewController {
} }
let stack = MoleculeStackView(frame: .zero) let stack = MoleculeStackView(frame: .zero)
stack.useStackSpacingBeforeFirstItem = true stack.useStackSpacingBeforeFirstItem = true
stack.moleculesShouldSetHorizontalMargins = true
stack.setWithJSON(moleculeJSON, delegateObject: delegateObject() as? MVMCoreUIDelegateObject, additionalData: nil) stack.setWithJSON(moleculeJSON, delegateObject: delegateObject() as? MVMCoreUIDelegateObject, additionalData: nil)
return stack return stack
} }

View File

@ -1,52 +0,0 @@
//
// MVMCoreUITextFormViewController.swift
// MVMCoreUI
//
// Created by Suresh, Kamlesh on 1/24/19.
// Copyright © 2019 Verizon Wireless. All rights reserved.
//
import UIKit
public class TextFieldListFormViewController: TopLabelsAndBottomButtonsViewController {
public var textFieldListView: MFTextFieldListView?
public override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
public override func updateViews() {
super.updateViews()
}
public override func newDataBuildScreen() {
super.newDataBuildScreen()
topLabelsView?.separatorView?.isHidden = true
}
public override func buildViewsBetweenLabelsAndButtons() -> [UIView]? {
var viewList: [UIView] = []
if let textFieldsList = loadObject?.pageJSON?.arrayForKey("textFieldList") as? [[String: Any]] {
let textFieldListView = MFTextFieldListView(textFieldMapList: textFieldsList,
parentViewContoller: self,
primaryButton: self.primaryButton)
self.textFieldListView = textFieldListView
viewList.append(textFieldListView)
}
return viewList
}
public override func handleOpenPage(for requestParameters: MVMCoreRequestParameters, actionInformation: [AnyHashable : Any]?, additionalData: [AnyHashable : Any]?) {
textFieldListView?.addParams(requestParameters: requestParameters)
super.handleOpenPage(for: requestParameters, actionInformation: actionInformation, additionalData: additionalData)
}
public override func spaceAboveBetweenView() -> NSNumber? {
return PaddingFour as NSNumber
}
}

View File

@ -78,3 +78,7 @@ typedef NS_ENUM(NSInteger, CoreUIErrorCode) {
ErrorCodeModuleMolecule = 100, ErrorCodeModuleMolecule = 100,
ErrorCodeListMolecule = 101 ErrorCodeListMolecule = 101
}; };
#pragma mark - Apple Design Guidelines
extern CGFloat const MinimumTappableArea;

View File

@ -70,3 +70,7 @@ BOOL DisableAnimations = NO;
// Hand Scroll Key // Hand Scroll Key
NSString * const KeyHandScrollAnimation = @"handScrollAnimation"; NSString * const KeyHandScrollAnimation = @"handScrollAnimation";
NSString * const KeyHandScroll = @"hand_scroll"; NSString * const KeyHandScroll = @"hand_scroll";
#pragma mark - Apple Design Guidelines
CGFloat const MinimumTappableArea = 44.0f;