diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index ffa63ba7..e8de3dd6 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -14,19 +14,19 @@ 0116A4E5228B19640094F3ED /* RadioButtonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0116A4E4228B19640094F3ED /* RadioButtonModel.swift */; }; 012A889C23889E8400FE3DA1 /* TemplateModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A889B23889E8400FE3DA1 /* TemplateModelProtocol.swift */; }; 012A88AD238C418100FE3DA1 /* TemplateProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88AC238C418100FE3DA1 /* TemplateProtocol.swift */; }; - 012A88AF238C626E00FE3DA1 /* CarouselModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88AE238C626E00FE3DA1 /* CarouselModel.swift */; }; 012A88B1238C880100FE3DA1 /* PagingMoleculeProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88B0238C880100FE3DA1 /* PagingMoleculeProtocol.swift */; }; 012A88C2238D7BCA00FE3DA1 /* CarouselItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88C1238D7BCA00FE3DA1 /* CarouselItemModel.swift */; }; 012A88C4238D86E600FE3DA1 /* CollectionCellMoleculeProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88C3238D86E600FE3DA1 /* CollectionCellMoleculeProtocol.swift */; }; 012A88C6238DA34000FE3DA1 /* ModuleMoleculeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88C5238DA34000FE3DA1 /* ModuleMoleculeModel.swift */; }; 012A88C8238DB02000FE3DA1 /* ModelMoleculeDelegateProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88C7238DB02000FE3DA1 /* ModelMoleculeDelegateProtocol.swift */; }; + 012A88DA238ED42E00FE3DA1 /* StackPageTemplateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012CA9DF23888AC8003F810F /* StackPageTemplateModel.swift */; }; + 012A88DB238ED45900FE3DA1 /* CarouselModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012A88AE238C626E00FE3DA1 /* CarouselModel.swift */; }; 012CA98923849699003F810F /* SeperatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012CA98823849699003F810F /* SeperatorModel.swift */; }; 012CA99A2384A687003F810F /* MFTextField+ModelExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012CA9992384A687003F810F /* MFTextField+ModelExtension.swift */; }; 012CA99C23859FDC003F810F /* ViewConstrainingView+ModelExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012CA99B23859FDC003F810F /* ViewConstrainingView+ModelExtension.swift */; }; 012CA99E2385A2D3003F810F /* MFView+ModelExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012CA99D2385A2D3003F810F /* MFView+ModelExtension.swift */; }; 012CA9BE2385C692003F810F /* ConstrainingMoleculeProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012CA9BD2385C692003F810F /* ConstrainingMoleculeProtocol.swift */; }; 012CA9DE2388723E003F810F /* ListPageTemplateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012CA9DD2388723E003F810F /* ListPageTemplateModel.swift */; }; - 012CA9E023888AC8003F810F /* StackPageTemplateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012CA9DF23888AC8003F810F /* StackPageTemplateModel.swift */; }; 012CA9E223888AED003F810F /* StackCenteredPageTemplateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012CA9E123888AED003F810F /* StackCenteredPageTemplateModel.swift */; }; 012CA9E423888B1B003F810F /* ThreeLayerPageTemplateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012CA9E323888B1B003F810F /* ThreeLayerPageTemplateModel.swift */; }; 01509D8F2327EC6F00EF99AA /* MoleculeTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01509D8E2327EC6F00EF99AA /* MoleculeTableViewCell.swift */; }; @@ -52,7 +52,6 @@ 01EB3684236097C0006832FA /* MoleculeProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB3683236097C0006832FA /* MoleculeProtocol.swift */; }; 01EB368F23609801006832FA /* LabelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368823609801006832FA /* LabelModel.swift */; }; 01EB369023609801006832FA /* ListItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368923609801006832FA /* ListItemModel.swift */; }; - 01EB369123609801006832FA /* MoleculeStackItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368A23609801006832FA /* MoleculeStackItemModel.swift */; }; 01EB369223609801006832FA /* MoleculeStackModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368B23609801006832FA /* MoleculeStackModel.swift */; }; 01EB369323609801006832FA /* HeaderModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368C23609801006832FA /* HeaderModel.swift */; }; 01EB369423609801006832FA /* HeadlineBodyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368D23609801006832FA /* HeadlineBodyModel.swift */; }; @@ -66,9 +65,8 @@ 9455B19C234F8A0400A574DB /* MVMAnimationFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */; }; 946EE1BA237B66D80036751F /* ModelHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 946EE1B9237B66D80036751F /* ModelHelper.swift */; }; 948DB67E2326DCD90011F916 /* MultiProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 948DB67D2326DCD90011F916 /* MultiProgress.swift */; }; - D206997721FB8A0B00CAE0DE /* MVMCoreUINavigationController.h in Headers */ = {isa = PBXBuildFile; fileRef = D206997521FB8A0B00CAE0DE /* MVMCoreUINavigationController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D206997821FB8A0B00CAE0DE /* MVMCoreUINavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = D206997621FB8A0B00CAE0DE /* MVMCoreUINavigationController.m */; }; D20A9A5E2243D3E300ADE781 /* TwoButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */; }; + D213347723843825008E41B3 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = D213347623843825008E41B3 /* Line.swift */; }; D224798A2314445E003FCCF9 /* LabelSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479892314445E003FCCF9 /* LabelSwitch.swift */; }; D224798C231450C8003FCCF9 /* HeadlineBodySwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D224798B231450C8003FCCF9 /* HeadlineBodySwitch.swift */; }; D22479942316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479932316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift */; }; @@ -85,6 +83,7 @@ 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 */; }; D260D7B622D68514007E7233 /* MVMCoreUIPagingProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D260D7B522D68509007E7233 /* MVMCoreUIPagingProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D268C70C2386DFFD007F2C1C /* MoleculeStackItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368A23609801006832FA /* MoleculeStackItemModel.swift */; }; D274CA332236A78900B01B62 /* StandardFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D274CA322236A78900B01B62 /* StandardFooterView.swift */; }; D2755D7B23689C7500485468 /* TableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2755D7A23689C7500485468 /* TableViewCell.swift */; }; D27CD40E2322EEAF00C1DC07 /* TabsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D27CD40D2322EEAF00C1DC07 /* TabsTableViewCell.swift */; }; @@ -92,8 +91,6 @@ D282AAB4223FDDAE00C46919 /* MFLoadImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D282AAB3223FDDAE00C46919 /* MFLoadImageView.swift */; }; D282AABA224131D100C46919 /* MFTransparentGIFView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */; }; D282AACB2243C61700C46919 /* ButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D282AACA2243C61700C46919 /* ButtonView.swift */; }; - D28B4F8A21FF967C00712C7A /* MVMCoreUIObject.h in Headers */ = {isa = PBXBuildFile; fileRef = D28B4F8821FF967C00712C7A /* MVMCoreUIObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D28B4F8B21FF967C00712C7A /* MVMCoreUIObject.m in Sources */ = {isa = PBXBuildFile; fileRef = D28B4F8921FF967C00712C7A /* MVMCoreUIObject.m */; }; D296E13C229598BF0051EBE7 /* MoleculeListCellProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D296E13B2295969C0051EBE7 /* MoleculeListCellProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; D296E1412295EBBA0051EBE7 /* MoleculeDelegateProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D296E1402295EBBA0051EBE7 /* MoleculeDelegateProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; D296E14722A5984C0051EBE7 /* MVMCoreUIViewConstrainingProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D296E14622A597490051EBE7 /* MVMCoreUIViewConstrainingProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -222,6 +219,8 @@ D2A6390522CBCE160052ED1F /* MoleculeCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A6390422CBCE160052ED1F /* MoleculeCollectionViewCell.swift */; }; D2B18B7F2360913400A9AEDC /* Control.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B18B7E2360913400A9AEDC /* Control.swift */; }; D2B18B812360945C00A9AEDC /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B18B802360945C00A9AEDC /* View.swift */; }; + D2B18B922361E65A00A9AEDC /* CoreUIObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B18B912361E65A00A9AEDC /* CoreUIObject.swift */; }; + D2B18B94236214AD00A9AEDC /* NavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B18B93236214AD00A9AEDC /* NavigationController.swift */; }; D2B1E3E522F37D6A0065F95C /* ImageHeadlineBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B1E3E422F37D6A0065F95C /* ImageHeadlineBody.swift */; }; D2C5001821F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.h in Headers */ = {isa = PBXBuildFile; fileRef = D2C5001621F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; D2C5001921F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m in Sources */ = {isa = PBXBuildFile; fileRef = D2C5001721F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m */; }; @@ -297,9 +296,8 @@ 9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MVMAnimationFramework.framework; path = ../SharedFrameworks/MVMAnimationFramework.framework; sourceTree = ""; }; 946EE1B9237B66D80036751F /* ModelHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModelHelper.swift; sourceTree = ""; }; 948DB67D2326DCD90011F916 /* MultiProgress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiProgress.swift; sourceTree = ""; }; - D206997521FB8A0B00CAE0DE /* MVMCoreUINavigationController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUINavigationController.h; sourceTree = ""; }; - D206997621FB8A0B00CAE0DE /* MVMCoreUINavigationController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUINavigationController.m; sourceTree = ""; }; D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwoButtonView.swift; sourceTree = ""; }; + D213347623843825008E41B3 /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = ""; }; D22479892314445E003FCCF9 /* LabelSwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelSwitch.swift; sourceTree = ""; }; D224798B231450C8003FCCF9 /* HeadlineBodySwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodySwitch.swift; sourceTree = ""; }; D22479932316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSLayoutConstraintExtension.swift; sourceTree = ""; }; @@ -323,8 +321,6 @@ D282AAB3223FDDAE00C46919 /* MFLoadImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MFLoadImageView.swift; sourceTree = ""; }; D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MFTransparentGIFView.swift; sourceTree = ""; }; D282AACA2243C61700C46919 /* ButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonView.swift; sourceTree = ""; }; - D28B4F8821FF967C00712C7A /* MVMCoreUIObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIObject.h; sourceTree = ""; }; - D28B4F8921FF967C00712C7A /* MVMCoreUIObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIObject.m; sourceTree = ""; }; D296E13B2295969C0051EBE7 /* MoleculeListCellProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MoleculeListCellProtocol.h; sourceTree = ""; }; D296E1402295EBBA0051EBE7 /* MoleculeDelegateProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MoleculeDelegateProtocol.h; sourceTree = ""; }; D296E14622A597490051EBE7 /* MVMCoreUIViewConstrainingProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIViewConstrainingProtocol.h; sourceTree = ""; }; @@ -457,6 +453,8 @@ D2A6390422CBCE160052ED1F /* MoleculeCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeCollectionViewCell.swift; sourceTree = ""; }; D2B18B7E2360913400A9AEDC /* Control.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Control.swift; sourceTree = ""; }; D2B18B802360945C00A9AEDC /* View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = View.swift; sourceTree = ""; }; + D2B18B912361E65A00A9AEDC /* CoreUIObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreUIObject.swift; sourceTree = ""; }; + D2B18B93236214AD00A9AEDC /* NavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationController.swift; sourceTree = ""; }; D2B1E3E422F37D6A0065F95C /* ImageHeadlineBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageHeadlineBody.swift; sourceTree = ""; }; D2C5001621F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIViewControllerMappingObject.h; sourceTree = ""; }; D2C5001721F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIViewControllerMappingObject.m; sourceTree = ""; }; @@ -465,6 +463,7 @@ D2E1FADA2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MVMCoreUIDelegateObject.swift; sourceTree = ""; }; D2E1FADE2268B8E700AEFD8C /* ThreeLayerTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreeLayerTableViewController.swift; sourceTree = ""; }; D2E1FAE02268E81D00AEFD8C /* MoleculeListTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeListTemplate.swift; sourceTree = ""; }; + D2F4DDE52371A4CB00CD28BB /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; DB06250A2293456500B72DD3 /* LeftRightLabelView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LeftRightLabelView.swift; sourceTree = ""; }; DB891E822253FA8500022516 /* Label.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = ""; }; DBC4391622442196001AB423 /* CaretView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CaretView.swift; sourceTree = ""; }; @@ -553,6 +552,32 @@ path = Extensions; sourceTree = ""; }; + D213347423842FE3008E41B3 /* Controllers */ = { + isa = PBXGroup; + children = ( + D29DF29321E7ADB8003B2FB9 /* StackableViewController.h */, + D29DF28E21E7ADB8003B2FB9 /* StackableViewController.m */, + D29770F021F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.h */, + D29770F121F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.m */, + D29770EF21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.h */, + D29770EE21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.m */, + ); + path = Controllers; + sourceTree = ""; + }; + D213347523842FF5008E41B3 /* Views */ = { + isa = PBXGroup; + children = ( + D29DF17E21E69E2E003B2FB9 /* MFView.h */, + D29DF17F21E69E2E003B2FB9 /* MFView.m */, + D29DF31E21ED0CBA003B2FB9 /* LabelView.h */, + D29DF31F21ED0CBA003B2FB9 /* LabelView.m */, + D29DF15921E697DA003B2FB9 /* SeparatorView.h */, + D29DF15A21E697DA003B2FB9 /* SeparatorView.m */, + ); + path = Views; + sourceTree = ""; + }; D224798823142BF2003FCCF9 /* SwitchMolecules */ = { isa = PBXGroup; children = ( @@ -612,17 +637,13 @@ path = Items; sourceTree = ""; }; - D22D1F582204D2590077CEC0 /* LegacyControllers */ = { + D22D1F582204D2590077CEC0 /* Legacy */ = { isa = PBXGroup; children = ( - D29DF29321E7ADB8003B2FB9 /* StackableViewController.h */, - D29DF28E21E7ADB8003B2FB9 /* StackableViewController.m */, - D29770F021F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.h */, - D29770F121F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.m */, - D29770EF21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.h */, - D29770EE21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.m */, + D213347523842FF5008E41B3 /* Views */, + D213347423842FE3008E41B3 /* Controllers */, ); - path = LegacyControllers; + path = Legacy; sourceTree = ""; }; D29DF0C221E404D4003B2FB9 = { @@ -654,7 +675,7 @@ D29DF13321E68604003B2FB9 /* Styles */, D29DF11021E6805F003B2FB9 /* Categories */, D29DF11921E68467003B2FB9 /* Containers */, - D22D1F582204D2590077CEC0 /* LegacyControllers */, + D22D1F582204D2590077CEC0 /* Legacy */, D29DF10F21E67A7D003B2FB9 /* BaseControllers */, D29DF11E21E6851E003B2FB9 /* TopAlert */, D29DF10D21E67A70003B2FB9 /* Atoms */, @@ -742,6 +763,7 @@ D29DF2CD21E7C104003B2FB9 /* MFLoadingViewController.m */, D2A5146A2214905000345BFB /* ThreeLayerViewController.swift */, D2E1FADE2268B8E700AEFD8C /* ThreeLayerTableViewController.swift */, + D2F4DDE52371A4CB00CD28BB /* ViewController.swift */, ); path = BaseControllers; sourceTree = ""; @@ -763,8 +785,7 @@ children = ( D29DF2B721E7BE79003B2FB9 /* TabBarController */, D29DF2B621E7BE66003B2FB9 /* SplitViewController */, - D206997521FB8A0B00CAE0DE /* MVMCoreUINavigationController.h */, - D206997621FB8A0B00CAE0DE /* MVMCoreUINavigationController.m */, + D2B18B93236214AD00A9AEDC /* NavigationController.swift */, ); path = Containers; sourceTree = ""; @@ -851,21 +872,16 @@ DBC4391622442196001AB423 /* CaretView.swift */, DBC4391722442197001AB423 /* DashLine.swift */, DB06250A2293456500B72DD3 /* LeftRightLabelView.swift */, - D29DF17E21E69E2E003B2FB9 /* MFView.h */, - D29DF17F21E69E2E003B2FB9 /* MFView.m */, 012CA99D2385A2D3003F810F /* MFView+ModelExtension.swift */, - D29DF31E21ED0CBA003B2FB9 /* LabelView.h */, - D29DF31F21ED0CBA003B2FB9 /* LabelView.m */, D29DF28721E7AC2B003B2FB9 /* ViewConstrainingView.h */, D29DF28821E7AC2B003B2FB9 /* ViewConstrainingView.m */, 012CA99B23859FDC003F810F /* ViewConstrainingView+ModelExtension.swift */, D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */, D282AAB3223FDDAE00C46919 /* MFLoadImageView.swift */, + D213347623843825008E41B3 /* Line.swift */, D29DF2AD21E7B3A4003B2FB9 /* MFTextView.h */, D29DF2AB21E7B3A4003B2FB9 /* MFTextView.m */, D29DF2AC21E7B3A4003B2FB9 /* MFTextView.xib */, - D29DF15921E697DA003B2FB9 /* SeparatorView.h */, - D29DF15A21E697DA003B2FB9 /* SeparatorView.m */, D29DF2B121E7B76C003B2FB9 /* MFLoadingSpinner.h */, D29DF2B221E7B76D003B2FB9 /* MFLoadingSpinner.m */, D29DF32321ED0DA2003B2FB9 /* TextButtonView.h */, @@ -933,8 +949,7 @@ isa = PBXGroup; children = ( D2E1FADA2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift */, - D28B4F8821FF967C00712C7A /* MVMCoreUIObject.h */, - D28B4F8921FF967C00712C7A /* MVMCoreUIObject.m */, + D2B18B912361E65A00A9AEDC /* CoreUIObject.swift */, D29DF27721E7A533003B2FB9 /* MVMCoreUISession.h */, D29DF27821E7A533003B2FB9 /* MVMCoreUISession.m */, D29DF27321E79E81003B2FB9 /* MVMCoreUILoggingHandler.h */, @@ -1028,7 +1043,6 @@ D260D7B622D68514007E7233 /* MVMCoreUIPagingProtocol.h in Headers */, D29DF18021E69E49003B2FB9 /* MFView.h in Headers */, D29DF27921E7A533003B2FB9 /* MVMCoreUISession.h in Headers */, - D206997721FB8A0B00CAE0DE /* MVMCoreUINavigationController.h in Headers */, D29DF29D21E7AE38003B2FB9 /* MFStyler.h in Headers */, D29DF2B021E7B3A4003B2FB9 /* MFTextView.h in Headers */, D29DF2A921E7B2F9003B2FB9 /* MVMCoreUIConstants.h in Headers */, @@ -1071,7 +1085,6 @@ D29DF13121E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.h in Headers */, D29DF2C421E7BF57003B2FB9 /* MFTabBarSwipeAnimator.h in Headers */, D2A5145D2211D22A00345BFB /* MVMCoreUIMoleculeViewProtocol.h in Headers */, - D28B4F8A21FF967C00712C7A /* MVMCoreUIObject.h in Headers */, D29DF2CA21E7BFC8003B2FB9 /* MFSizeThreshold.h in Headers */, D29DF28021E7AA51003B2FB9 /* MVMCoreUIDetailViewProtocol.h in Headers */, D29DF2BD21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.h in Headers */, @@ -1229,26 +1242,27 @@ 012CA99E2385A2D3003F810F /* MFView+ModelExtension.swift in Sources */, D29DF25421E6A177003B2FB9 /* MFMdnTextField.m in Sources */, D282AABA224131D100C46919 /* MFTransparentGIFView.swift in Sources */, - 012A88AF238C626E00FE3DA1 /* CarouselModel.swift in Sources */, - 012CA9E023888AC8003F810F /* StackPageTemplateModel.swift in Sources */, + D213347723843825008E41B3 /* Line.swift in Sources */, D2A514672213885800345BFB /* StandardHeaderView.swift in Sources */, 01EB369023609801006832FA /* ListItemModel.swift in Sources */, + D268C70C2386DFFD007F2C1C /* MoleculeStackItemModel.swift in Sources */, DBEFFA04225A829700230692 /* Label.swift in Sources */, D2D6CD4022E78C1A00D701B8 /* Scroller.swift in Sources */, 01509D952327ED1900EF99AA /* HeadlineBodyTextButtonSwitch.swift in Sources */, D29DF13021E6851E003B2FB9 /* MVMCoreUITopAlertShortView.m in Sources */, - D28B4F8B21FF967C00712C7A /* MVMCoreUIObject.m in Sources */, 0A1B4A96233BB18F005B3FB4 /* CheckboxWithLabelView.swift in Sources */, D260D7B222D65BDD007E7233 /* MVMCoreUIPageControl.m in Sources */, D2B18B812360945C00A9AEDC /* View.swift in Sources */, D29DF26D21E6AA0B003B2FB9 /* FLAnimatedImageView.m in Sources */, D29DF2EF21ECEAE1003B2FB9 /* MFFonts.m in Sources */, D22479942316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift in Sources */, + D2B18B94236214AD00A9AEDC /* NavigationController.swift in Sources */, D282AACB2243C61700C46919 /* ButtonView.swift in Sources */, D2D6CD4222E78FAB00D701B8 /* ThreeLayerTemplate.swift in Sources */, 01EB368F23609801006832FA /* LabelModel.swift in Sources */, 0105618F224BBE7700E1557D /* FormValidator+FormParams.swift in Sources */, 012CA9E223888AED003F810F /* StackCenteredPageTemplateModel.swift in Sources */, + 012A88DA238ED42E00FE3DA1 /* StackPageTemplateModel.swift in Sources */, 0A7BAFA1232BE61800FB8E22 /* Checkbox.swift in Sources */, D22479962316AF6E003FCCF9 /* HeadlineBodyTextButton.swift in Sources */, D29DF2AE21E7B3A4003B2FB9 /* MFTextView.m in Sources */, @@ -1261,7 +1275,6 @@ D274CA332236A78900B01B62 /* StandardFooterView.swift in Sources */, D29DF2BF21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.m in Sources */, D29DF28321E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.m in Sources */, - D206997821FB8A0B00CAE0DE /* MVMCoreUINavigationController.m in Sources */, D29DF27A21E7A533003B2FB9 /* MVMCoreUISession.m in Sources */, 01DF55E021F8FAA800CC099B /* MFTextFieldListView.swift in Sources */, D2A5146B2214905000345BFB /* ThreeLayerViewController.swift in Sources */, @@ -1279,6 +1292,7 @@ D224798A2314445E003FCCF9 /* LabelSwitch.swift in Sources */, D22D1F47220496A30077CEC0 /* MVMCoreUISwitch.m in Sources */, 017BEB4223620AD20024EF95 /* FormModelProtocol.swift in Sources */, + 012A88DB238ED45900FE3DA1 /* CarouselModel.swift in Sources */, D29DF28C21E7AC2B003B2FB9 /* ViewConstrainingView.m in Sources */, D29DF17B21E69E1F003B2FB9 /* PrimaryButton.m in Sources */, 017BEB4A236235BA0024EF95 /* ModelMoleculeViewProtocol.swift in Sources */, @@ -1311,7 +1325,7 @@ 0105618E224BBE7700E1557D /* FormValidator+TextFields.swift in Sources */, 012CA99C23859FDC003F810F /* ViewConstrainingView+ModelExtension.swift in Sources */, 0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */, - 01EB369123609801006832FA /* MoleculeStackItemModel.swift in Sources */, + D2B18B922361E65A00A9AEDC /* CoreUIObject.swift in Sources */, D29DF2BE21E7BEA4003B2FB9 /* TopTabbar.m in Sources */, D2A514632213643100345BFB /* MoleculeStackCenteredTemplate.swift in Sources */, D29DF32421ED0DA2003B2FB9 /* TextButtonView.m in Sources */, diff --git a/MVMCoreUI/Atoms/Views/CaretView.swift b/MVMCoreUI/Atoms/Views/CaretView.swift index ec4457c2..b68d0535 100644 --- a/MVMCoreUI/Atoms/Views/CaretView.swift +++ b/MVMCoreUI/Atoms/Views/CaretView.swift @@ -8,7 +8,7 @@ // -open class CaretView: MFView { +open class CaretView: View { //------------------------------------------------------ // MARK: - Properties //------------------------------------------------------ @@ -26,7 +26,7 @@ open class CaretView: MFView { // MARK: - Initialization //------------------------------------------------------ - @objc public init() { + @objc public override init() { super.init(frame: .zero) } @@ -99,7 +99,7 @@ open class CaretView: MFView { //------------------------------------------------------ // Default values for view. - @objc open override func setAsMolecule() { + @objc open func setAsMolecule() { defaultState() } @@ -124,12 +124,14 @@ open class CaretView: MFView { lineWidth = lineWidthValue } } - - open override func needsToBeConstrained() -> Bool { +} + +extension CaretView: MVMCoreUIViewConstrainingProtocol { + open func needsToBeConstrained() -> Bool { return true } - open override func alignment() -> UIStackView.Alignment { + open func alignment() -> UIStackView.Alignment { return UIStackView.Alignment.leading; } } diff --git a/MVMCoreUI/Atoms/Views/DashLine.swift b/MVMCoreUI/Atoms/Views/DashLine.swift index 512b48cd..25e39b1b 100644 --- a/MVMCoreUI/Atoms/Views/DashLine.swift +++ b/MVMCoreUI/Atoms/Views/DashLine.swift @@ -10,7 +10,7 @@ import MVMCore -open class DashLine: MFView { +open class DashLine: View { //------------------------------------------------------ // MARK: - Properties //------------------------------------------------------ @@ -62,8 +62,7 @@ open class DashLine: MFView { //------------------------------------------------------ // Default values for view. - @objc open override func setAsMolecule() { - + @objc open func setAsMolecule() { backgroundColor = .clear isHidden = false } diff --git a/MVMCoreUI/Atoms/Views/GraphView.swift b/MVMCoreUI/Atoms/Views/GraphView.swift index e919e445..0a828259 100644 --- a/MVMCoreUI/Atoms/Views/GraphView.swift +++ b/MVMCoreUI/Atoms/Views/GraphView.swift @@ -109,7 +109,7 @@ public struct GraphObject { } -@objcMembers open class GraphView: View { +@objcMembers open class GraphView: View, MVMCoreUIViewConstrainingProtocol { var heightConstraint: NSLayoutConstraint? var gradientLayer: CALayer? @@ -244,6 +244,10 @@ public struct GraphObject { return containLayer } +//MARK: MVMCoreUIViewConstrainingProtocol + public func needsToBeConstrained() -> Bool { + return true + } //MARK: Animation func rotationAnimation(_ object: GraphObject) { diff --git a/MVMCoreUI/Atoms/Views/Label.swift b/MVMCoreUI/Atoms/Views/Label.swift index 6b013f82..2f68a8d4 100644 --- a/MVMCoreUI/Atoms/Views/Label.swift +++ b/MVMCoreUI/Atoms/Views/Label.swift @@ -85,7 +85,6 @@ public typealias ActionBlock = () -> () //------------------------------------------------------ @objc public func setupView() { - backgroundColor = .clear numberOfLines = 0 lineBreakMode = .byWordWrapping @@ -213,7 +212,7 @@ public typealias ActionBlock = () -> () } @objc public static func setUILabel(_ label: UILabel?, withJSON json: [AnyHashable: Any]?, delegate: DelegateObject?, additionalData: [AnyHashable: Any]?) { - //LabelModel() + guard let label = label else { return } label.attributedText = nil label.text = json?.optionalStringForKey(KeyText) diff --git a/MVMCoreUI/Atoms/Views/Line.swift b/MVMCoreUI/Atoms/Views/Line.swift new file mode 100644 index 00000000..f7a81ac5 --- /dev/null +++ b/MVMCoreUI/Atoms/Views/Line.swift @@ -0,0 +1,106 @@ +// +// Line.swift +// MVMCoreUI +// +// Created by Scott Pfeil on 11/19/19. +// Copyright © 2019 Verizon Wireless. All rights reserved. +// + +import UIKit + +@objcMembers open class Line: View { + + public var heightConstraint: NSLayoutConstraint? + + public enum Style: String, Codable { + case standard + case thin + case medium + case heavy + case none + } + + public var style = Style.standard { + didSet { + switch style { + case .standard: + heightConstraint?.constant = 1 + backgroundColor = .mfSilver() + case .thin: + heightConstraint?.constant = 1 + backgroundColor = .black + case .medium: + heightConstraint?.constant = 2 + backgroundColor = .black + case .heavy: + heightConstraint?.constant = 4 + backgroundColor = .black + case .none: + heightConstraint?.constant = 0 + } + setNeedsLayout() + layoutIfNeeded() + } + } + + // MARK: - Helpers + open func shouldBeVisible() -> Bool { + guard let type = json?.optionalStringForKey(KeyType) else { return false } + return type != "none" + } + + public convenience init(pinTo view: UIView, edge: UIRectEdge, useMargin: Bool) { + self.init(frame: .zero) + view.addSubview(self) + NSLayoutConstraint.activate(Array(NSLayoutConstraint.pinView(toSuperview: self, useMargins: useMargin, pinTop: edge != .bottom, pinBottom: edge != .top, pinLeft: edge != .right, pinRight: edge != .left).values)) + } + + // MARK: - MVMCoreViewProtocol + open override func setupView() { + super.setupView() + backgroundColor = .black + heightConstraint = heightAnchor.constraint(equalToConstant: 1) + heightConstraint?.isActive = true + } + + // MARK: - MVMCoreUIMoleculeViewProtocol + open override func setWithJSON(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) { + + // If no type, default to standard. + if let typeString = json?.optionalStringForKey(KeyType), let type = Style.init(rawValue: typeString) { + style = type + } else { + style = .standard + } + + super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) + } + + open override func reset() { + style = .standard + } + + open func copyBackgroundColor() -> Bool { + return false + } + + public static func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { + guard let type = json?.optionalStringForKey(KeyType), let style = Style(rawValue: type) else { return 1 } + switch style { + case .none: + return 0 + case .medium: + return 2 + case .heavy: + return 4 + default: + return 1 + } + } +} + +extension Line: MVMCoreUIViewConstrainingProtocol { + open func needsToBeConstrained() -> Bool { + return true + } +} diff --git a/MVMCoreUI/Atoms/Views/MVMCoreUICheckBox.m b/MVMCoreUI/Atoms/Views/MVMCoreUICheckBox.m index 50377b1a..54358ebe 100644 --- a/MVMCoreUI/Atoms/Views/MVMCoreUICheckBox.m +++ b/MVMCoreUI/Atoms/Views/MVMCoreUICheckBox.m @@ -228,7 +228,9 @@ static const CGFloat CheckBoxHeightWidth = 18.0; NSDictionary *constraints = [NSLayoutConstraint constraintPinView:checkedSquare heightConstraint:YES heightConstant:size widthConstraint:YES widthConstant:size]; self.checkboxWidth = constraints[ConstraintWidth]; self.checkboxHeight = constraints[ConstraintHeight]; - [NSLayoutConstraint constraintPinSubview:checkedSquare pinTop:YES pinBottom:YES pinLeft:YES pinRight:NO]; + [NSLayoutConstraint constraintPinSubview:checkedSquare pinTop:NO pinBottom:NO pinLeft:YES pinRight:NO]; + [checkedSquare.topAnchor constraintGreaterThanOrEqualToAnchor:containterView.topAnchor].active = YES; + [containterView.bottomAnchor constraintGreaterThanOrEqualToAnchor:checkedSquare.bottomAnchor].active = YES; self.checkboxRightPinConstraint = [checkedSquare.trailingAnchor constraintEqualToAnchor:containterView.trailingAnchor]; @@ -255,7 +257,7 @@ static const CGFloat CheckBoxHeightWidth = 18.0; Label *descriptionLabel = [Label commonLabelB2:YES]; [containterView addSubview:descriptionLabel]; [NSLayoutConstraint constraintPinSubview:descriptionLabel pinCenterX:NO pinCenterY:YES]; - [NSLayoutConstraint constraintPinSubview:descriptionLabel pinTop:NO pinBottom:NO pinLeft:NO pinRight:YES]; + [NSLayoutConstraint constraintPinSubview:descriptionLabel pinTop:YES pinBottom:YES pinLeft:NO pinRight:YES]; self.descriptionLabelLeadingConstraint = [NSLayoutConstraint constraintWithItem:descriptionLabel attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.checkedSquare attribute:NSLayoutAttributeTrailing multiplier:1 constant:11]; self.descriptionLabelLeadingConstraint.active = YES; diff --git a/MVMCoreUI/Atoms/Views/MultiProgress.swift b/MVMCoreUI/Atoms/Views/MultiProgress.swift index fe902d9f..fdfb5316 100644 --- a/MVMCoreUI/Atoms/Views/MultiProgress.swift +++ b/MVMCoreUI/Atoms/Views/MultiProgress.swift @@ -34,7 +34,7 @@ import UIKit } } -@objcMembers open class MultiProgress: MFView { +@objcMembers open class MultiProgress: View { ///passing value to progressList creates corresponding progress bars var progressList: Array? { didSet { @@ -49,7 +49,7 @@ import UIKit guard progressObject.progress > 0.0 else { continue } - let view = MFView(frame: .zero) + let view = UIView(frame: .zero) view.translatesAutoresizingMaskIntoConstraints = false addSubview(view) view.backgroundColor = progressObject.color diff --git a/MVMCoreUI/BaseControllers/MFViewController.m b/MVMCoreUI/BaseControllers/MFViewController.m index 2e0f2c73..153af17f 100644 --- a/MVMCoreUI/BaseControllers/MFViewController.m +++ b/MVMCoreUI/BaseControllers/MFViewController.m @@ -35,7 +35,6 @@ #import "MVMCoreUISession.h" #import "MVMCoreUILoggingHandler.h" #import "MVMCoreUITabBarPageControlViewController.h" -#import "MVMCoreUINavigationController.h" #import @import MVMAnimationFramework; diff --git a/MVMCoreUI/Categories/NSLayoutConstraint+MFConvenience.h b/MVMCoreUI/Categories/NSLayoutConstraint+MFConvenience.h index 3d615da7..824b8b81 100644 --- a/MVMCoreUI/Categories/NSLayoutConstraint+MFConvenience.h +++ b/MVMCoreUI/Categories/NSLayoutConstraint+MFConvenience.h @@ -62,6 +62,8 @@ extern NSString * _Nonnull const ConstraintWidth; #pragma mark - With Margins + (nonnull NSDictionary *)pinViewToSuperview:(nonnull UIView *)subview useMargins:(BOOL)useMargins; ++ (nonnull NSDictionary *)pinViewToSuperview:(nonnull UIView *)subview useMargins:(BOOL)useMargins pinTop:(BOOL)pinTop pinBottom:(BOOL)pinBottom pinLeft:(BOOL)pinLeft pinRight:(BOOL)pinRight; ++ (nonnull NSDictionary *)pinViewToSuperview:(nonnull UIView *)subview useMargins:(BOOL)useMargins pinTop:(BOOL)pinTop topConstant:(CGFloat)topConstant pinBottom:(BOOL)pinBottom bottomConstant:(CGFloat)bottomConstant pinLeft:(BOOL)pinLeft leftConstant:(CGFloat)leftConstant pinRight:(BOOL)pinRight rightConstant:(CGFloat)rightConstant; + (nonnull NSLayoutConstraint *)pinViewTopToSuperview:(nonnull UIView *)view useMargins:(BOOL)useMargins constant:(CGFloat)constant; + (nonnull NSLayoutConstraint *)pinViewLeftToSuperview:(nonnull UIView *)view useMargins:(BOOL)useMargins constant:(CGFloat)constant; + (nonnull NSLayoutConstraint *)pinViewRightToSuperview:(nonnull UIView *)view useMargins:(BOOL)useMargins constant:(CGFloat)constant; diff --git a/MVMCoreUI/Categories/NSLayoutConstraint+MFConvenience.m b/MVMCoreUI/Categories/NSLayoutConstraint+MFConvenience.m index 72aad96f..43fa6beb 100644 --- a/MVMCoreUI/Categories/NSLayoutConstraint+MFConvenience.m +++ b/MVMCoreUI/Categories/NSLayoutConstraint+MFConvenience.m @@ -161,11 +161,28 @@ NSString *const ConstraintWidth = @"width"; #pragma mark - With Margins + (nonnull NSDictionary *)pinViewToSuperview:(nonnull UIView *)subview useMargins:(BOOL)useMargins { - return @{ConstraintTop:[self pinViewTopToSuperview:subview useMargins:useMargins constant:0], - ConstraintLeading:[self pinViewLeftToSuperview:subview useMargins:useMargins constant:0], - ConstraintTrailing:[self pinViewRightToSuperview:subview useMargins:useMargins constant:0], - ConstraintBot:[self pinViewBottomToSuperview:subview useMargins:useMargins constant:0], - }; + return [NSLayoutConstraint pinViewToSuperview:subview useMargins:useMargins pinTop:YES topConstant:0 pinBottom:YES bottomConstant:0 pinLeft:YES leftConstant:0 pinRight:YES rightConstant:0]; +} + ++ (nonnull NSDictionary *)pinViewToSuperview:(nonnull UIView *)subview useMargins:(BOOL)useMargins pinTop:(BOOL)pinTop pinBottom:(BOOL)pinBottom pinLeft:(BOOL)pinLeft pinRight:(BOOL)pinRight { + return [NSLayoutConstraint pinViewToSuperview:subview useMargins:useMargins pinTop:pinTop topConstant:0 pinBottom:pinBottom bottomConstant:0 pinLeft:pinLeft leftConstant:0 pinRight:pinRight rightConstant:0]; +} + ++ (NSDictionary *)pinViewToSuperview:(UIView *)subview useMargins:(BOOL)useMargins pinTop:(BOOL)pinTop topConstant:(CGFloat)topConstant pinBottom:(BOOL)pinBottom bottomConstant:(CGFloat)bottomConstant pinLeft:(BOOL)pinLeft leftConstant:(CGFloat)leftConstant pinRight:(BOOL)pinRight rightConstant:(CGFloat)rightConstant { + NSMutableDictionary *constraints = [[NSMutableDictionary alloc] init]; + if (pinTop) { + [constraints setObject:[self pinViewTopToSuperview:subview useMargins:useMargins constant:topConstant] forKey:ConstraintTop]; + } + if (pinLeft) { + [constraints setObject:[self pinViewLeftToSuperview:subview useMargins:useMargins constant:topConstant] forKey:ConstraintLeading]; + } + if (pinRight) { + [constraints setObject:[self pinViewRightToSuperview:subview useMargins:useMargins constant:topConstant] forKey:ConstraintTrailing]; + } + if (pinBottom) { + [constraints setObject:[self pinViewBottomToSuperview:subview useMargins:useMargins constant:topConstant] forKey:ConstraintBot]; + } + return constraints; } + (NSLayoutConstraint *)pinViewTopToSuperview:(UIView *)view useMargins:(BOOL)useMargins constant:(CGFloat)constant { diff --git a/MVMCoreUI/Containers/MVMCoreUINavigationController.h b/MVMCoreUI/Containers/MVMCoreUINavigationController.h deleted file mode 100644 index abe6efa7..00000000 --- a/MVMCoreUI/Containers/MVMCoreUINavigationController.h +++ /dev/null @@ -1,28 +0,0 @@ -// -// MVMCoreUINavigationController.h -// MVMCoreUI -// -// Created by Scott Pfeil on 1/25/19. -// Copyright © 2019 Verizon Wireless. All rights reserved. -// - -#import -@class SeparatorView; -NS_ASSUME_NONNULL_BEGIN - -@interface MVMCoreUINavigationController : UINavigationController - -// Convenience getter -+ (nullable instancetype)navigationController; - -// Returns a navigation controller with the mvm styling. Also sets the navigation controller in the appropriate handlers. -+ (nullable instancetype)setupNavigationController; - -// Returns a navigation controller with the mvm styling. Also sets the navigation controller in the appropriate handlers. Adds the default loading overlay screen as well. -+ (nullable instancetype)setupWithNavigationControllerAsMainController; - -// Separator at the bottom of the navigation bar used for styling. -@property (nullable, weak, nonatomic) SeparatorView *separatorView; -@end - -NS_ASSUME_NONNULL_END diff --git a/MVMCoreUI/Containers/MVMCoreUINavigationController.m b/MVMCoreUI/Containers/MVMCoreUINavigationController.m deleted file mode 100644 index bbfe856e..00000000 --- a/MVMCoreUI/Containers/MVMCoreUINavigationController.m +++ /dev/null @@ -1,52 +0,0 @@ -// -// MVMCoreUINavigationController.m -// MVMCoreUI -// -// Created by Scott Pfeil on 1/25/19. -// Copyright © 2019 Verizon Wireless. All rights reserved. -// - -#import "MVMCoreUINavigationController.h" -#import "UIColor+MFConvenience.h" -#import "SeparatorView.h" -#import "MFFonts.h" -#import "MFSizeObject.h" -#import "MVMCoreUISession.h" -@import MVMCore.MVMCoreActionUtility; -@import MVMCore.MVMCoreNavigationHandler; -@interface MVMCoreUINavigationController () - -@end - -@implementation MVMCoreUINavigationController - -+ (nullable instancetype)navigationController { - return [MVMCoreActionUtility initializerClassCheck:[MVMCoreUISession sharedGlobal].navigationController classToVerify:self]; -} - -+ (nullable instancetype)setupNavigationController { - MVMCoreUINavigationController *navigationController = [[MVMCoreUINavigationController alloc] init]; - [UIColor mfSetBackgroundColorForNavigationBar:[UIColor whiteColor] navigationBar:navigationController.navigationBar transparent:NO]; - [navigationController.navigationBar setShadowImage:[[UIImage alloc] init]]; - navigationController.navigationBar.translucent = NO; - navigationController.navigationBar.opaque = YES; - navigationController.navigationBar.tintColor = [UIColor blackColor]; - navigationController.separatorView = [SeparatorView separatorAddToView:navigationController.navigationBar position:SeparatorPositionBot withHorizontalPadding:0]; - [navigationController.separatorView setAsLight]; - [navigationController.navigationBar setTitleTextAttributes:@{NSFontAttributeName:[MFFonts mfFont75Bd:[[MFSizeObject sizeObjectWithStandardSize:14 standardiPadPortraitSize:16 iPadProLandscapeSize:18] getValueBasedOnScreenSize]]}]; - - // Set standard - [MVMCoreUISession sharedGlobal].navigationController = navigationController; - [MVMCoreNavigationHandler sharedNavigationHandler].navigationController = navigationController; - [MVMCoreNavigationHandler sharedNavigationHandler].viewControllerToPresentOn = navigationController; - - return navigationController; -} - -+ (nullable instancetype)setupWithNavigationControllerAsMainController { - MVMCoreUINavigationController *navigationController = [self setupNavigationController]; - [[MVMCoreUISession sharedGlobal] setupAsStandardLoadViewDelegate:navigationController]; - return navigationController; -} - -@end diff --git a/MVMCoreUI/Containers/NavigationController.swift b/MVMCoreUI/Containers/NavigationController.swift new file mode 100644 index 00000000..353ea861 --- /dev/null +++ b/MVMCoreUI/Containers/NavigationController.swift @@ -0,0 +1,44 @@ +// +// NavigationController.swift +// MVMCoreUI +// +// Created by Scott Pfeil on 10/24/19. +// Copyright © 2019 Verizon Wireless. All rights reserved. +// + +import UIKit + +@objcMembers open class NavigationController: UINavigationController { + public var separatorView: Line? + + public static func navigationController() -> Self? { + return MVMCoreActionUtility.initializerClassCheck(MVMCoreUISession.sharedGlobal()?.navigationController, classToVerify: self) as? Self + } + + public static func style(_ navigationBar: UINavigationBar) { + UIColor.mfSetBackgroundColor(forNavigationBar: .white, navigationBar: navigationBar, transparent: false) + navigationBar.shadowImage = UIImage() + navigationBar.isOpaque = true + navigationBar.tintColor = .black + if let font = MFFonts.mfFont75Bd(MFSizeObject(standardSize: 14, standardiPadPortraitSize: 16, iPadProLandscapeSize: 18)?.getValueBasedOnScreenSize() ?? 14) { + navigationBar.titleTextAttributes = [NSAttributedString.Key.font: font]; + } + } + + public static func setupNavigationController() -> Self? { + let navigationController = self.init() + style(navigationController.navigationBar) + navigationController.separatorView = Line(pinTo: navigationController.navigationBar, edge: .bottom, useMargin: false) + navigationController.separatorView?.style = .standard + MVMCoreUISession.sharedGlobal()?.navigationController = navigationController + MVMCoreNavigationHandler.shared()?.viewControllerToPresentOn = navigationController + MVMCoreNavigationHandler.shared()?.navigationController = navigationController + return navigationController + } + + public static func setupNavigationControllerAsMainController() -> Self? { + guard let navigationController = setupNavigationController() else { return nil } + MVMCoreUISession.sharedGlobal()?.setup(asStandardLoadViewDelegate: navigationController) + return navigationController + } +} diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.h b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.h index cf27dc78..af02281d 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.h +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.h @@ -11,10 +11,9 @@ @import MVMCore.MVMCoreActionDelegateProtocol; #import #import - -@class MVMCoreUINavigationController; @class MVMCoreUITopAlertView; @class MFViewController; +@class NavigationController; typedef NS_ENUM(NSInteger, MFNumberOfDrawers) { MFNoDrawer = 0, @@ -34,7 +33,7 @@ typedef NS_ENUM(NSInteger, MFNumberOfDrawers) { @property (nullable, strong, nonatomic) UIBarButtonItem *backButton; -@property (nullable, weak, nonatomic, readonly) MVMCoreUINavigationController *navigationController; +@property (nullable, weak, nonatomic, readonly) NavigationController *navigationController; // Reference to the top alert view @property (nullable, weak, nonatomic) MVMCoreUITopAlertView *topAlertView; diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m index af1e5c53..b529ac19 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m @@ -23,7 +23,7 @@ #import "MVMCoreUIConstants.h" #import "MVMCoreUICommonViewsUtility.h" #import "MVMCoreUITopAlertView.h" -#import "MVMCoreUINavigationController.h" +#import @interface MVMCoreUISplitViewController () @@ -50,7 +50,7 @@ typedef NS_OPTIONS(NSInteger, MFExtendedDrawer) { @property (weak, nonatomic, readwrite) UIViewController *leftPanel; @property (weak, nonatomic, readwrite) UIViewController *rightPanel; -@property (weak, nonatomic, readwrite) MVMCoreUINavigationController *navigationController; +@property (weak, nonatomic, readwrite) NavigationController *navigationController; // A view that covers the detail view when the master is out. @property (weak, nonatomic) IBOutlet UIView *mainViewCoverView; @@ -802,7 +802,7 @@ CGFloat const PanelAnimationDuration = 0.2; } // The main view. - MVMCoreUINavigationController *navigationController = [MVMCoreUINavigationController setupNavigationController]; + NavigationController *navigationController = [NavigationController setupNavigationController]; self.navigationController = navigationController; self.automaticallyAdjustsScrollViewInsets = NO; diff --git a/MVMCoreUI/LegacyControllers/StackableViewController.h b/MVMCoreUI/Legacy/Controllers/StackableViewController.h similarity index 100% rename from MVMCoreUI/LegacyControllers/StackableViewController.h rename to MVMCoreUI/Legacy/Controllers/StackableViewController.h diff --git a/MVMCoreUI/LegacyControllers/StackableViewController.m b/MVMCoreUI/Legacy/Controllers/StackableViewController.m similarity index 100% rename from MVMCoreUI/LegacyControllers/StackableViewController.m rename to MVMCoreUI/Legacy/Controllers/StackableViewController.m diff --git a/MVMCoreUI/LegacyControllers/TopLabelsAndBottomButtonsTableViewController.h b/MVMCoreUI/Legacy/Controllers/TopLabelsAndBottomButtonsTableViewController.h similarity index 98% rename from MVMCoreUI/LegacyControllers/TopLabelsAndBottomButtonsTableViewController.h rename to MVMCoreUI/Legacy/Controllers/TopLabelsAndBottomButtonsTableViewController.h index 04defbb4..b9beb281 100644 --- a/MVMCoreUI/LegacyControllers/TopLabelsAndBottomButtonsTableViewController.h +++ b/MVMCoreUI/Legacy/Controllers/TopLabelsAndBottomButtonsTableViewController.h @@ -71,4 +71,6 @@ - (BOOL)bottomViewOutsideOfScroll; //override for setting attributed headline and message -(void)setHeadlineAndMessage; +- (nullable UIView *)topAccessoryView; + @end diff --git a/MVMCoreUI/LegacyControllers/TopLabelsAndBottomButtonsTableViewController.m b/MVMCoreUI/Legacy/Controllers/TopLabelsAndBottomButtonsTableViewController.m similarity index 90% rename from MVMCoreUI/LegacyControllers/TopLabelsAndBottomButtonsTableViewController.m rename to MVMCoreUI/Legacy/Controllers/TopLabelsAndBottomButtonsTableViewController.m index 8b0a23bf..db1b7e5a 100644 --- a/MVMCoreUI/LegacyControllers/TopLabelsAndBottomButtonsTableViewController.m +++ b/MVMCoreUI/Legacy/Controllers/TopLabelsAndBottomButtonsTableViewController.m @@ -31,6 +31,7 @@ @property (strong, nonatomic) UIView *footerViewOutsideOfScroll; @property (strong, nonatomic) NSLayoutConstraint *bottomViewTopConstraint; @property (strong, nonatomic) UIView *headerAccessoryView; +@property (strong, nonatomic) UIView *topAccessoryView; @end @@ -70,6 +71,9 @@ } } +- (nullable UIView *)topAccessoryView { + return nil; +} - (void)newDataBuildScreen { [super newDataBuildScreen]; @@ -92,10 +96,10 @@ [self setHeadlineAndMessage]; self.topView = topLabelsView; } - + // Setup accessory view. [self setUpHeaderAccessoryView]; - + // add top view to table header if (self.topView) { self.topView.translatesAutoresizingMaskIntoConstraints = NO; @@ -253,16 +257,26 @@ UIView *headerAccessoryView = self.headerAccessoryView; [header addSubview:topView]; [header addSubview:headerAccessoryView]; - - // Sets up the constraints - if (headerAccessoryView) { - [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topView]-0-[headerAccessoryView]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(topView,headerAccessoryView)]]; - [NSLayoutConstraint constraintPinSubview:topView pinTop:YES topConstant:0 pinBottom:NO bottomConstant:0 pinLeft:YES leftConstant:0 pinRight:YES rightConstant:0]; - self.topViewBottomConstraint = [[NSLayoutConstraint constraintPinSubview:headerAccessoryView pinTop:NO topConstant:0 pinBottom:YES bottomConstant:[[self spaceAboveBetweenView] floatValue] pinLeft:YES leftConstant:0 pinRight:YES rightConstant:0] objectForKey:ConstraintBot ofType:[NSLayoutConstraint class]]; - } - else { - self.topViewBottomConstraint = [[NSLayoutConstraint constraintPinSubview:topView pinTop:YES topConstant:0 pinBottom:YES bottomConstant:[[self spaceAboveBetweenView] floatValue] pinLeft:YES leftConstant:0 pinRight:YES rightConstant:0] objectForKey:ConstraintBot ofType:[NSLayoutConstraint class]]; - } + + UIView *topAccessoryView = [self topAccessoryView]; + self.topAccessoryView = topAccessoryView; + if (topAccessoryView) { + [header addSubview:topAccessoryView]; + [NSLayoutConstraint constraintPinSubview:topAccessoryView pinTop:YES pinBottom:NO pinLeft:YES pinRight:YES]; + [topAccessoryView.bottomAnchor constraintEqualToAnchor:topView.topAnchor constant:0].active = YES; + } + + BOOL topPin = topAccessoryView ? NO : YES; + // Sets up the constraints + if (headerAccessoryView) { + [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topView]-0-[headerAccessoryView]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(topView,headerAccessoryView)]]; + [NSLayoutConstraint constraintPinSubview:topView pinTop:topPin topConstant:0 pinBottom:NO bottomConstant:0 pinLeft:YES leftConstant:0 pinRight:YES rightConstant:0]; + self.topViewBottomConstraint = [[NSLayoutConstraint constraintPinSubview:headerAccessoryView pinTop:NO topConstant:0 pinBottom:YES bottomConstant:[[self spaceAboveBetweenView] floatValue] pinLeft:YES leftConstant:0 pinRight:YES rightConstant:0] objectForKey:ConstraintBot ofType:[NSLayoutConstraint class]]; + } + else { + self.topViewBottomConstraint = [[NSLayoutConstraint constraintPinSubview:topView pinTop:topPin topConstant:0 pinBottom:YES bottomConstant:[[self spaceAboveBetweenView] floatValue] pinLeft:YES leftConstant:0 pinRight:YES rightConstant:0] objectForKey:ConstraintBot ofType:[NSLayoutConstraint class]]; + } + self.headerView = header; } @@ -281,6 +295,7 @@ self.footerView = footer; } + - (void)showHeader { if (self.headerView) { @@ -459,6 +474,10 @@ #pragma mark - Animation -(void)setupIntroAnimations { + + if (self.topAccessoryView.subviews.count) { + [self.introAnimationManager addAnimationWithAnimation:[MVMAnimations fadeUpAnimationWithView:self.topAccessoryView]]; + } if (self.topView.subviews.count) { [self.introAnimationManager addAnimationWithAnimation:[MVMAnimations fadeUpAnimationWithView:self.topView]]; } diff --git a/MVMCoreUI/LegacyControllers/TopLabelsAndBottomButtonsViewController.h b/MVMCoreUI/Legacy/Controllers/TopLabelsAndBottomButtonsViewController.h similarity index 98% rename from MVMCoreUI/LegacyControllers/TopLabelsAndBottomButtonsViewController.h rename to MVMCoreUI/Legacy/Controllers/TopLabelsAndBottomButtonsViewController.h index 720f0097..ab9823b8 100644 --- a/MVMCoreUI/LegacyControllers/TopLabelsAndBottomButtonsViewController.h +++ b/MVMCoreUI/Legacy/Controllers/TopLabelsAndBottomButtonsViewController.h @@ -38,6 +38,8 @@ #pragma mark - Subclass +- (nullable UIView *)topAccessoryView; + // Allow you to add any additional ui before buildViewsBetweenLabelsAndButtons gets called. Can use this to set the topBetweenEdgeView or bottomBetweenEdgeView - (void)buildInAdditionalViewsBeforeCenteredContent; // For subclassing. Should return all the views that will be in between labels and buttons. Override standardSpaceAroundUIObject to handle spacing. diff --git a/MVMCoreUI/LegacyControllers/TopLabelsAndBottomButtonsViewController.m b/MVMCoreUI/Legacy/Controllers/TopLabelsAndBottomButtonsViewController.m similarity index 94% rename from MVMCoreUI/LegacyControllers/TopLabelsAndBottomButtonsViewController.m rename to MVMCoreUI/Legacy/Controllers/TopLabelsAndBottomButtonsViewController.m index 0c9d1d5d..95c0e26e 100644 --- a/MVMCoreUI/LegacyControllers/TopLabelsAndBottomButtonsViewController.m +++ b/MVMCoreUI/Legacy/Controllers/TopLabelsAndBottomButtonsViewController.m @@ -31,6 +31,8 @@ @property (nullable, weak, nonatomic) UIView *betweenView; +@property (strong, nonatomic) UIView *topAccessoryView; + // Adds the button view to the screen. Out of the scroll or in. - (void)addViewOutsideOfScrollView:(UIView *)bottomView; - (void)addViewToContentView:(UIView *)bottomView; @@ -101,7 +103,7 @@ // Removes the bottom view out of scroll if it is there. [self.viewOutOfScroll removeFromSuperview]; [StackableViewController removeUIViews:[self.contentView subviews]]; - + // Checks if we are using a different object than top labels. UIView *topView = [self useCustomViewInsteadOfLabels]; self.topView = topView; @@ -115,9 +117,19 @@ } [self.contentView addSubview:topView]; [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[topView]-0-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(topView)]]; - self.topConstraintForTopView = [NSLayoutConstraint constraintWithItem:topView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0]; + + UIView *topAccessoryView = [self topAccessoryView]; + self.topAccessoryView = topAccessoryView; + if (topAccessoryView) { + [self.contentView addSubview:topAccessoryView]; + [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[topAccessoryView]-0-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(topAccessoryView)]]; + self.topConstraintForTopView = [NSLayoutConstraint constraintWithItem:topAccessoryView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0]; + [topAccessoryView.bottomAnchor constraintEqualToAnchor:topView.topAnchor constant:0].active = YES; + } else { + self.topConstraintForTopView = [NSLayoutConstraint constraintWithItem:topView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0]; + } + self.topConstraintForTopView.active = YES; - // Checks if we are using a different object than the bottom buttons. UIView *bottomView = [self useCustomViewInsteadOfButtons]; self.customBottemView = (bottomView != nil); @@ -266,7 +278,10 @@ if (self.topLabelsView) { [self.topLabelsView setHeadlineString:[[self mapForTopLabels] stringForKey:KeyTitle] messageString:[[self mapForTopLabels] stringForKey:KeyMessage]]; } - +} + +- (nullable UIView *)topAccessoryView { + return nil; } - (void)updateViewConstraints { @@ -409,6 +424,11 @@ #pragma mark - Animations -(void)setupIntroAnimations { + + if (self.topAccessoryView.subviews.count) { + [self.introAnimationManager addAnimationWithAnimation:[MVMAnimations fadeUpAnimationWithView:self.topAccessoryView]]; + } + if (self.topView.subviews) { [self.introAnimationManager addAnimationWithAnimation:[MVMAnimations fadeUpAnimationWithView:self.topView]]; } diff --git a/MVMCoreUI/Atoms/Views/LabelView.h b/MVMCoreUI/Legacy/Views/LabelView.h similarity index 100% rename from MVMCoreUI/Atoms/Views/LabelView.h rename to MVMCoreUI/Legacy/Views/LabelView.h diff --git a/MVMCoreUI/Atoms/Views/LabelView.m b/MVMCoreUI/Legacy/Views/LabelView.m similarity index 100% rename from MVMCoreUI/Atoms/Views/LabelView.m rename to MVMCoreUI/Legacy/Views/LabelView.m diff --git a/MVMCoreUI/Atoms/Views/MFView.h b/MVMCoreUI/Legacy/Views/MFView.h similarity index 100% rename from MVMCoreUI/Atoms/Views/MFView.h rename to MVMCoreUI/Legacy/Views/MFView.h diff --git a/MVMCoreUI/Atoms/Views/MFView.m b/MVMCoreUI/Legacy/Views/MFView.m similarity index 100% rename from MVMCoreUI/Atoms/Views/MFView.m rename to MVMCoreUI/Legacy/Views/MFView.m diff --git a/MVMCoreUI/Atoms/Views/SeparatorView.h b/MVMCoreUI/Legacy/Views/SeparatorView.h similarity index 100% rename from MVMCoreUI/Atoms/Views/SeparatorView.h rename to MVMCoreUI/Legacy/Views/SeparatorView.h diff --git a/MVMCoreUI/Atoms/Views/SeparatorView.m b/MVMCoreUI/Legacy/Views/SeparatorView.m similarity index 100% rename from MVMCoreUI/Atoms/Views/SeparatorView.m rename to MVMCoreUI/Legacy/Views/SeparatorView.m diff --git a/MVMCoreUI/MVMCoreUI.h b/MVMCoreUI/MVMCoreUI.h index 258fcd1c..795298b3 100644 --- a/MVMCoreUI/MVMCoreUI.h +++ b/MVMCoreUI/MVMCoreUI.h @@ -16,7 +16,6 @@ FOUNDATION_EXPORT const unsigned char MVMCoreUIVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import #pragma mark - OtherHandlers -#import #import #import #import @@ -59,8 +58,6 @@ FOUNDATION_EXPORT const unsigned char MVMCoreUIVersionString[]; #import #pragma mark - Containers -#import - #import #import #import diff --git a/MVMCoreUI/Models/Molecules/ListItemModel.swift b/MVMCoreUI/Models/Molecules/ListItemModel.swift index b2da3db1..4c7d01cf 100644 --- a/MVMCoreUI/Models/Molecules/ListItemModel.swift +++ b/MVMCoreUI/Models/Molecules/ListItemModel.swift @@ -12,15 +12,15 @@ import Foundation public static var identifier: String = "listItem" public var moleculeName: String? public var molecule: MoleculeProtocol? - public var actionMap: ActionMapModel? + public var action: ActionModel? public var hideArrow: Bool? public var separator: SeperatorModel? public var style: String? - public init(molecule: MoleculeProtocol?, actionMap: ActionMapModel?, hideArrow: Bool?, separator: SeperatorModel?, style: String?) { + public init(molecule: MoleculeProtocol?, actionMap: ActionModel?, hideArrow: Bool?, separator: SeperatorModel?, style: String?) { self.molecule = molecule - self.actionMap = actionMap + self.action = actionMap self.moleculeName = Self.identifier self.hideArrow = hideArrow self.separator = separator @@ -30,7 +30,7 @@ import Foundation enum CodingKeys: String, CodingKey { case moleculeName case molecule - case actionMap + case action case hideArrow case separator case style @@ -40,7 +40,7 @@ import Foundation let typeContainer = try decoder.container(keyedBy: CodingKeys.self) self.moleculeName = try typeContainer.decode(String.self, forKey: .moleculeName) self.molecule = try typeContainer.decodeIfPresent(codingKey: .molecule) - self.actionMap = try typeContainer.decodeIfPresent(ActionMapModel.self, forKey: .actionMap) + action = try typeContainer.decodeIfPresent(ActionModel.self, forKey: .action) self.hideArrow = try typeContainer.decode(Bool.self, forKey: .hideArrow) self.separator = try typeContainer.decode(SeperatorModel.self, forKey: .hideArrow) @@ -51,10 +51,6 @@ import Foundation var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(moleculeName, forKey: .moleculeName) try container.encodeIfPresent(self.molecule, forKey: .molecule) - try container.encodeIfPresent(actionMap, forKey: .actionMap) - - try container.encodeIfPresent(hideArrow, forKey: .hideArrow) - try container.encodeIfPresent(separator, forKey: .separator) - try container.encodeIfPresent(style, forKey: .style) + try container.encodeIfPresent(action, forKey: .action) } } diff --git a/MVMCoreUI/Molecules/Items/TableViewCell.swift b/MVMCoreUI/Molecules/Items/TableViewCell.swift index 7a097b5e..4b0e75cf 100644 --- a/MVMCoreUI/Molecules/Items/TableViewCell.swift +++ b/MVMCoreUI/Molecules/Items/TableViewCell.swift @@ -23,8 +23,8 @@ import UIKit private var caretViewHeightSizeObject: MFSizeObject? // For separation between cells. - public var topSeparatorView: SeparatorView? - public var bottomSeparatorView: SeparatorView? + public var topSeparatorView: Line? + public var bottomSeparatorView: Line? public enum SeparatorFrequency: String { case all case allExceptTop @@ -59,21 +59,22 @@ import UIKit open func styleStandard() { topMarginPadding = 24 bottomMarginPadding = 24 - bottomSeparatorView?.show() - bottomSeparatorView?.setAsLight() + topSeparatorView?.style = .none + bottomSeparatorView?.style = .standard } open func styleHeader() { topMarginPadding = 48 bottomMarginPadding = 16 - bottomSeparatorView?.show() - bottomSeparatorView?.setAsRegular() + topSeparatorView?.style = .none + bottomSeparatorView?.style = .thin } open func styleNone() { topMarginPadding = 0 bottomMarginPadding = 0 - bottomSeparatorView?.hide() + topSeparatorView?.style = .none + bottomSeparatorView?.style = .none } /// Adds the molecule to the view. @@ -113,23 +114,25 @@ import UIKit // MARK: - MFViewProtocol public func updateView(_ size: CGFloat) { MFStyler.setMarginsFor(self, size: size, defaultHorizontal: updateViewHorizontalDefaults, top: topMarginPadding, bottom: bottomMarginPadding) + if accessoryView != nil { // Smaller left margin if accessory view. var margin = directionalLayoutMargins margin.trailing = 16 contentView.directionalLayoutMargins = margin + + // Update caret automatically. + if let caretView = caretView, let widthObject = caretViewWidthSizeObject, let heightObject = caretViewHeightSizeObject { + caretView.frame = CGRect(x: 0, y: 0, width: widthObject.getValueBased(onSize: size), height: heightObject.getValueBased(onSize: size)) + } } else { contentView.directionalLayoutMargins = directionalLayoutMargins } - topSeparatorView?.setLeftAndRightPinConstant(directionalLayoutMargins.leading) - bottomSeparatorView?.setLeftAndRightPinConstant(directionalLayoutMargins.leading) - - molecule?.updateView(size) - if let _ = accessoryView, let caretView = caretView, let widthObject = caretViewWidthSizeObject, let heightObject = caretViewHeightSizeObject { - caretView.frame = CGRect(x: 0, y: 0, width: widthObject.getValueBased(onSize: size), height: heightObject.getValueBased(onSize: size)) - } + topSeparatorView?.updateView(size) bottomSeparatorView?.updateView(size) + + molecule?.updateView(size) } public func setupView() { @@ -163,7 +166,7 @@ import UIKit // Add the caret if there is an action and it's not declared hidden. if !customAccessoryView { - if let _ = model.actionMap, !(model.hideArrow ?? false) { + if let _ = model.action, !(model.hideArrow ?? false) { addCaretViewAccessory() } else { accessoryView = nil @@ -262,15 +265,15 @@ import UIKit setSeparatorFrequency(separatorFrequency, indexPath: indexPath) } } else { - topSeparatorView?.hide() - bottomSeparatorView?.setAsLight() + topSeparatorView?.style = .standard + bottomSeparatorView?.style = .standard setSeparatorFrequency(TableViewCell.SeparatorFrequency.allExceptTop, indexPath: indexPath) } } public func didSelectCell(atIndex indexPath: IndexPath, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { //TODO: Use object when handleAction is rewrote to handle action model - if let actionMap = self.listItemModel?.actionMap?.toJSON() { + if let actionMap = self.listItemModel?.action?.toJSON() { MVMCoreActionHandler.shared()?.handleAction(with: actionMap, additionalData: additionalData, delegateObject: delegateObject) } } @@ -282,12 +285,22 @@ import UIKit // MARK: - Separator open func addSeparatorsIfNeeded() { if topSeparatorView == nil { - topSeparatorView = SeparatorView.separatorAdd(to: self, position: SeparatorPositionTop) - topSeparatorView?.hide() + let line = Line() + line.style = .none + addSubview(line) + NSLayoutConstraint.pinViewTop(toSuperview: line, useMargins: false, constant: 0).isActive = true + NSLayoutConstraint.pinViewLeft(toSuperview: line, useMargins: true, constant: 0).isActive = true + NSLayoutConstraint.pinViewRight(toSuperview: line, useMargins: true, constant: 0).isActive = true + topSeparatorView = line } if bottomSeparatorView == nil { - bottomSeparatorView = SeparatorView.separatorAdd(to: self, position: SeparatorPositionBot) - bottomSeparatorView?.hide() + let line = Line() + line.style = .none + addSubview(line) + NSLayoutConstraint.pinViewBottom(toSuperview: line, useMargins: false, constant: 0).isActive = true + NSLayoutConstraint.pinViewLeft(toSuperview: line, useMargins: true, constant: 0).isActive = true + NSLayoutConstraint.pinViewRight(toSuperview: line, useMargins: true, constant: 0).isActive = true + bottomSeparatorView = line } } @@ -296,26 +309,26 @@ import UIKit switch separatorFrequency { case .all: if indexPath.row == 0 { - topSeparatorView?.show() + topSeparatorView?.isHidden = false } else { - topSeparatorView?.hide() + topSeparatorView?.isHidden = true } - bottomSeparatorView?.show() + bottomSeparatorView?.isHidden = false case .allExceptBottom: - topSeparatorView?.show() - bottomSeparatorView?.hide() + topSeparatorView?.isHidden = false + bottomSeparatorView?.isHidden = true case .between: if indexPath.row == 0 { - topSeparatorView?.hide() + topSeparatorView?.isHidden = true } else { - topSeparatorView?.show() + topSeparatorView?.isHidden = false } - bottomSeparatorView?.hide() + bottomSeparatorView?.isHidden = true case .allExceptTop: fallthrough default: - topSeparatorView?.hide() - bottomSeparatorView?.show() + topSeparatorView?.isHidden = true + bottomSeparatorView?.isHidden = false } } } diff --git a/MVMCoreUI/Molecules/StandardHeaderView.swift b/MVMCoreUI/Molecules/StandardHeaderView.swift index 32b14bb2..71880d69 100644 --- a/MVMCoreUI/Molecules/StandardHeaderView.swift +++ b/MVMCoreUI/Molecules/StandardHeaderView.swift @@ -9,13 +9,12 @@ import UIKit public class StandardHeaderView: ViewConstrainingView, ModelMoleculeViewProtocol { - - var separatorView: SeparatorView? + var line: Line? // MARK: - MVMCoreViewProtocol open override func updateView(_ size: CGFloat) { super.updateView(size) - separatorView?.updateView(size) + line?.updateView(size) } public override func setupView() { @@ -25,21 +24,15 @@ public class StandardHeaderView: ViewConstrainingView, ModelMoleculeViewProtocol updateViewHorizontalDefaults = true topMarginPadding = PaddingDefaultVerticalSpacing bottomMarginPadding = PaddingDefaultVerticalSpacing - if separatorView == nil, let separatorView = SeparatorView.separatorAdd(to: self, position: SeparatorPositionBot, withHorizontalPadding: 0) { - separatorView.setAsHeavy() - addSubview(separatorView) - self.separatorView = separatorView - } - } - - public override func setLeftPinConstant(_ constant: CGFloat) { - super.setLeftPinConstant(constant) - separatorView?.leftPin?.constant = constant - } - - public override func setRightPinConstant(_ constant: CGFloat) { - super.setRightPinConstant(constant) - separatorView?.rightPin?.constant = constant + + guard line == nil else { return } + let line = Line() + line.style = .heavy + addSubview(line) + NSLayoutConstraint.pinViewBottom(toSuperview: line, useMargins: false, constant: 0).isActive = true + NSLayoutConstraint.pinViewLeft(toSuperview: line, useMargins: true, constant: 0).isActive = true + NSLayoutConstraint.pinViewRight(toSuperview: line, useMargins: true, constant: 0).isActive = true + self.line = line } // MARK: - MVMCoreUIMoleculeViewProtocol @@ -51,7 +44,7 @@ public class StandardHeaderView: ViewConstrainingView, ModelMoleculeViewProtocol (molecule as? MVMCoreUIViewConstrainingProtocol)?.shouldSetVerticalMargins?(false) if let separatorJSON = json?.optionalDictionaryForKey("separator") { - separatorView?.setWithJSON(separatorJSON, delegateObject: delegateObject, additionalData: additionalData) + line?.setWithJSON(separatorJSON, delegateObject: delegateObject, additionalData: additionalData) } } @@ -70,7 +63,7 @@ public class StandardHeaderView: ViewConstrainingView, ModelMoleculeViewProtocol } if let seperatorModel = headerModel.seperator as? LineModel { - separatorView?.setWithJSON(seperatorModel.toJSON(), delegateObject: delegateObject, additionalData: additionalData) + line?.setWithJSON(seperatorModel.toJSON(), delegateObject: delegateObject, additionalData: additionalData) } } @@ -78,8 +71,7 @@ public class StandardHeaderView: ViewConstrainingView, ModelMoleculeViewProtocol super.reset() topMarginPadding = PaddingDefaultVerticalSpacing bottomMarginPadding = PaddingDefaultVerticalSpacing - separatorView?.setAsHeavy() - separatorView?.show() + line?.style = .heavy } public override class func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { diff --git a/MVMCoreUI/OtherHandlers/CoreUIObject.swift b/MVMCoreUI/OtherHandlers/CoreUIObject.swift new file mode 100644 index 00000000..af0f5023 --- /dev/null +++ b/MVMCoreUI/OtherHandlers/CoreUIObject.swift @@ -0,0 +1,23 @@ +// +// CoreUIObject.swift +// MVMCoreUI +// +// Created by Scott Pfeil on 10/24/19. +// Copyright © 2019 Verizon Wireless. All rights reserved. +// + +import UIKit + +@objcMembers open class CoreUIObject: MVMCoreObject { + public var moleculeMap: MVMCoreUIMoleculeMappingObject? + + open override func defaultInitialSetup() { + cache = MVMCoreCache() + sessionHandler = MVMCoreSessionTimeHandler() + actionHandler = MVMCoreActionHandler() + session = MVMCoreUISession() + viewControllerMapping = MVMCoreUIViewControllerMappingObject() + loggingDelegate = MVMCoreUILoggingHandler() + moleculeMap = MVMCoreUIMoleculeMappingObject() + } +} diff --git a/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m b/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m index 86f69f86..44bb0a56 100644 --- a/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m +++ b/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject.m @@ -11,7 +11,6 @@ @import MVMCore.NSDictionary_MFConvenience; @import MVMCore.MVMCoreLoadObject; @import MVMCore.MVMCoreErrorObject; -#import "MVMCoreUIObject.h" #import #import "MFTextField.h" #import "MVMCoreUIPageControl.h" @@ -28,7 +27,7 @@ dispatch_once(&onceToken, ^{ mapping = [@{ @"label": Label.class, - @"line": SeparatorView.class, + @"line": Line.class, @"button": ButtonView.class, @"textButton": MFTextButton.class, @"header": StandardHeaderView.class, @@ -45,7 +44,6 @@ @"progressbar": ProgressBar.class, @"circleProgress": GraphView.class, @"multiProgressBar": MultiProgress.class, - @"checkbox": MVMCoreUICheckBox.class, @"radioButton": RadioButton.class, @"radioButtonLabel": RadioButtonLabel.class, @"listItem": MoleculeTableViewCell.class, @@ -74,7 +72,7 @@ } + (nullable instancetype)sharedMappingObject { - return [MVMCoreActionUtility initializerClassCheck:[MVMCoreUIObject sharedInstance].moleculeMap classToVerify:self]; + return [MVMCoreActionUtility initializerClassCheck:[CoreUIObject sharedInstance].moleculeMap classToVerify:self]; } - (instancetype)init { diff --git a/MVMCoreUI/OtherHandlers/MVMCoreUIObject.h b/MVMCoreUI/OtherHandlers/MVMCoreUIObject.h deleted file mode 100644 index 080bd457..00000000 --- a/MVMCoreUI/OtherHandlers/MVMCoreUIObject.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// MVMCoreUIObject.h -// MVMCoreUI -// -// Created by Scott Pfeil on 1/28/19. -// Copyright © 2019 Verizon Wireless. All rights reserved. -// - -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface MVMCoreUIObject : MVMCoreObject - -@property (nullable, nonatomic, strong) MVMCoreUIMoleculeMappingObject *moleculeMap; - -@end - -NS_ASSUME_NONNULL_END diff --git a/MVMCoreUI/OtherHandlers/MVMCoreUIObject.m b/MVMCoreUI/OtherHandlers/MVMCoreUIObject.m deleted file mode 100644 index cea769d1..00000000 --- a/MVMCoreUI/OtherHandlers/MVMCoreUIObject.m +++ /dev/null @@ -1,27 +0,0 @@ -// -// MVMCoreUIObject.m -// MVMCoreUI -// -// Created by Scott Pfeil on 1/28/19. -// Copyright © 2019 Verizon Wireless. All rights reserved. -// - -#import "MVMCoreUIObject.h" -#import "MVMCoreUISession.h" -#import "MVMCoreUIViewControllerMappingObject.h" -#import "MVMCoreUILoggingHandler.h" - -@implementation MVMCoreUIObject - -- (void)defaultInitialSetup { - self.cache = [[MVMCoreCache alloc] init]; - self.sessionHandler = [[MVMCoreSessionTimeHandler alloc] init]; - self.actionHandler = [[MVMCoreActionHandler alloc] init]; - - self.session = [[MVMCoreUISession alloc] init]; - self.viewControllerMapping = [[MVMCoreUIViewControllerMappingObject alloc] init]; - self.loggingDelegate = [[MVMCoreUILoggingHandler alloc] init]; - self.moleculeMap = [[MVMCoreUIMoleculeMappingObject alloc] init]; -} - -@end diff --git a/MVMCoreUI/OtherHandlers/MVMCoreUISession.h b/MVMCoreUI/OtherHandlers/MVMCoreUISession.h index 8adb32cd..ca2db26e 100644 --- a/MVMCoreUI/OtherHandlers/MVMCoreUISession.h +++ b/MVMCoreUI/OtherHandlers/MVMCoreUISession.h @@ -11,15 +11,15 @@ @class MVMCoreUITopAlertView; @class MVMCoreUISplitViewController; @class MFViewController; -@class MVMCoreUINavigationController; @class MFLoadingViewController; +@class NavigationController; NS_ASSUME_NONNULL_BEGIN @interface MVMCoreUISession : MVMCoreSessionObject @property (weak, nonatomic, nullable) MVMCoreUITopAlertView *topAlertView; @property (weak, nonatomic, nullable) MVMCoreUISplitViewController *splitViewController; -@property (weak, nonatomic, nullable) MVMCoreUINavigationController *navigationController; +@property (weak, nonatomic, nullable) NavigationController *navigationController; @property (weak, nonatomic, nullable) MFLoadingViewController *loadingViewController; /// Tracks the current page type the user is currently viewing. KVO compliant. diff --git a/MVMCoreUI/OtherHandlers/MoleculeDelegateProtocol.h b/MVMCoreUI/OtherHandlers/MoleculeDelegateProtocol.h index 57eb63f5..a69dad3c 100644 --- a/MVMCoreUI/OtherHandlers/MoleculeDelegateProtocol.h +++ b/MVMCoreUI/OtherHandlers/MoleculeDelegateProtocol.h @@ -6,6 +6,7 @@ // Copyright © 2019 Verizon Wireless. All rights reserved. // #import +#import @protocol MoleculeDelegateProtocol diff --git a/MVMCoreUI/Templates/MoleculeListTemplate.swift b/MVMCoreUI/Templates/MoleculeListTemplate.swift index 0d645e35..fd1885cc 100644 --- a/MVMCoreUI/Templates/MoleculeListTemplate.swift +++ b/MVMCoreUI/Templates/MoleculeListTemplate.swift @@ -93,14 +93,13 @@ open class MoleculeListTemplate: ThreeLayerTableViewController, TemplateProtocol return UITableViewCell() } let delegate = delegateObject() as? MVMCoreUIDelegateObject + let moleculeCell = cell as? MVMCoreUIMoleculeViewProtocol + moleculeCell?.reset?() if let protocolCell = cell as? MoleculeListCellProtocol { protocolCell.setSeparatorWithJSON?(loadObject?.pageJSON?.optionalDictionaryForKey("separator"), delegateObject: delegate, additionalData: nil, indexPath: indexPath) } - if let protocolCell = cell as? MVMCoreUIMoleculeViewProtocol { - protocolCell.reset?() - (protocolCell as? ModelMoleculeViewProtocol)?.setWithModel(moleculeInfo.molecule, delegate, nil) - protocolCell.updateView(tableView.bounds.width) - } + (moleculeCell as? ModelMoleculeViewProtocol)?.setWithModel(moleculeInfo.molecule, delegate, nil) + moleculeCell?.updateView(tableView.bounds.width) return cell } diff --git a/MVMCoreUI/Utility/MVMCoreUIUtility.m b/MVMCoreUI/Utility/MVMCoreUIUtility.m index 48a7a6a1..b760eb36 100644 --- a/MVMCoreUI/Utility/MVMCoreUIUtility.m +++ b/MVMCoreUI/Utility/MVMCoreUIUtility.m @@ -9,7 +9,6 @@ #import "MVMCoreUIUtility.h" #import "MVMCoreUIConstants.h" #import "MVMCoreUISession.h" -#import "MVMCoreUINavigationController.h" #import "MVMCoreUISplitViewController.h" @import MVMCore.MVMCoreNavigationHandler; @import MVMCore.MVMCoreGetterUtility;