merge from develop

This commit is contained in:
panxi 2019-11-26 11:30:43 -05:00
commit 8422362e77
39 changed files with 401 additions and 269 deletions

View File

@ -61,9 +61,8 @@
94C2D9A723872DA90006CF46 /* LabelAttributeColorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9A623872DA90006CF46 /* LabelAttributeColorModel.swift */; }; 94C2D9A723872DA90006CF46 /* LabelAttributeColorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9A623872DA90006CF46 /* LabelAttributeColorModel.swift */; };
94C2D9A923872E5E0006CF46 /* LabelAttributeImageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9A823872E5E0006CF46 /* LabelAttributeImageModel.swift */; }; 94C2D9A923872E5E0006CF46 /* LabelAttributeImageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9A823872E5E0006CF46 /* LabelAttributeImageModel.swift */; };
94C2D9AB23872EB50006CF46 /* LabelAttributeActionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9AA23872EB50006CF46 /* LabelAttributeActionModel.swift */; }; 94C2D9AB23872EB50006CF46 /* LabelAttributeActionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94C2D9AA23872EB50006CF46 /* LabelAttributeActionModel.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 */; }; 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 */; }; D224798A2314445E003FCCF9 /* LabelSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479892314445E003FCCF9 /* LabelSwitch.swift */; };
D224798C231450C8003FCCF9 /* HeadlineBodySwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D224798B231450C8003FCCF9 /* HeadlineBodySwitch.swift */; }; D224798C231450C8003FCCF9 /* HeadlineBodySwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D224798B231450C8003FCCF9 /* HeadlineBodySwitch.swift */; };
D22479942316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479932316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift */; }; D22479942316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479932316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift */; };
@ -87,8 +86,6 @@
D282AAB4223FDDAE00C46919 /* MFLoadImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D282AAB3223FDDAE00C46919 /* MFLoadImageView.swift */; }; D282AAB4223FDDAE00C46919 /* MFLoadImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D282AAB3223FDDAE00C46919 /* MFLoadImageView.swift */; };
D282AABA224131D100C46919 /* MFTransparentGIFView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */; }; D282AABA224131D100C46919 /* MFTransparentGIFView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */; };
D282AACB2243C61700C46919 /* ButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D282AACA2243C61700C46919 /* ButtonView.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, ); }; }; 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, ); }; }; 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, ); }; }; D296E14722A5984C0051EBE7 /* MVMCoreUIViewConstrainingProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D296E14622A597490051EBE7 /* MVMCoreUIViewConstrainingProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
@ -217,6 +214,8 @@
D2A6390522CBCE160052ED1F /* MoleculeCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A6390422CBCE160052ED1F /* MoleculeCollectionViewCell.swift */; }; D2A6390522CBCE160052ED1F /* MoleculeCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A6390422CBCE160052ED1F /* MoleculeCollectionViewCell.swift */; };
D2B18B7F2360913400A9AEDC /* Control.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B18B7E2360913400A9AEDC /* Control.swift */; }; D2B18B7F2360913400A9AEDC /* Control.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B18B7E2360913400A9AEDC /* Control.swift */; };
D2B18B812360945C00A9AEDC /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B18B802360945C00A9AEDC /* View.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 */; }; 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, ); }; }; 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 */; }; D2C5001921F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m in Sources */ = {isa = PBXBuildFile; fileRef = D2C5001721F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m */; };
@ -287,9 +286,8 @@
94C2D9A623872DA90006CF46 /* LabelAttributeColorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeColorModel.swift; sourceTree = "<group>"; }; 94C2D9A623872DA90006CF46 /* LabelAttributeColorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeColorModel.swift; sourceTree = "<group>"; };
94C2D9A823872E5E0006CF46 /* LabelAttributeImageModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeImageModel.swift; sourceTree = "<group>"; }; 94C2D9A823872E5E0006CF46 /* LabelAttributeImageModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeImageModel.swift; sourceTree = "<group>"; };
94C2D9AA23872EB50006CF46 /* LabelAttributeActionModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeActionModel.swift; sourceTree = "<group>"; }; 94C2D9AA23872EB50006CF46 /* LabelAttributeActionModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelAttributeActionModel.swift; sourceTree = "<group>"; };
D206997521FB8A0B00CAE0DE /* MVMCoreUINavigationController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUINavigationController.h; sourceTree = "<group>"; };
D206997621FB8A0B00CAE0DE /* MVMCoreUINavigationController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUINavigationController.m; 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>"; };
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>"; };
D224798B231450C8003FCCF9 /* HeadlineBodySwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodySwitch.swift; sourceTree = "<group>"; }; D224798B231450C8003FCCF9 /* HeadlineBodySwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlineBodySwitch.swift; sourceTree = "<group>"; };
D22479932316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSLayoutConstraintExtension.swift; sourceTree = "<group>"; }; D22479932316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSLayoutConstraintExtension.swift; sourceTree = "<group>"; };
@ -313,8 +311,6 @@
D282AAB3223FDDAE00C46919 /* MFLoadImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MFLoadImageView.swift; sourceTree = "<group>"; }; D282AAB3223FDDAE00C46919 /* MFLoadImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MFLoadImageView.swift; sourceTree = "<group>"; };
D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MFTransparentGIFView.swift; sourceTree = "<group>"; }; D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MFTransparentGIFView.swift; sourceTree = "<group>"; };
D282AACA2243C61700C46919 /* ButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonView.swift; sourceTree = "<group>"; }; D282AACA2243C61700C46919 /* ButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonView.swift; sourceTree = "<group>"; };
D28B4F8821FF967C00712C7A /* MVMCoreUIObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIObject.h; sourceTree = "<group>"; };
D28B4F8921FF967C00712C7A /* MVMCoreUIObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIObject.m; sourceTree = "<group>"; };
D296E13B2295969C0051EBE7 /* MoleculeListCellProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MoleculeListCellProtocol.h; sourceTree = "<group>"; }; D296E13B2295969C0051EBE7 /* MoleculeListCellProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MoleculeListCellProtocol.h; sourceTree = "<group>"; };
D296E1402295EBBA0051EBE7 /* MoleculeDelegateProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MoleculeDelegateProtocol.h; sourceTree = "<group>"; }; D296E1402295EBBA0051EBE7 /* MoleculeDelegateProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MoleculeDelegateProtocol.h; sourceTree = "<group>"; };
D296E14622A597490051EBE7 /* MVMCoreUIViewConstrainingProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIViewConstrainingProtocol.h; sourceTree = "<group>"; }; D296E14622A597490051EBE7 /* MVMCoreUIViewConstrainingProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIViewConstrainingProtocol.h; sourceTree = "<group>"; };
@ -447,6 +443,8 @@
D2A6390422CBCE160052ED1F /* MoleculeCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeCollectionViewCell.swift; sourceTree = "<group>"; }; D2A6390422CBCE160052ED1F /* MoleculeCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoleculeCollectionViewCell.swift; sourceTree = "<group>"; };
D2B18B7E2360913400A9AEDC /* Control.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Control.swift; sourceTree = "<group>"; }; D2B18B7E2360913400A9AEDC /* Control.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Control.swift; sourceTree = "<group>"; };
D2B18B802360945C00A9AEDC /* View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = View.swift; sourceTree = "<group>"; }; D2B18B802360945C00A9AEDC /* View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = View.swift; sourceTree = "<group>"; };
D2B18B912361E65A00A9AEDC /* CoreUIObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreUIObject.swift; sourceTree = "<group>"; };
D2B18B93236214AD00A9AEDC /* NavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationController.swift; sourceTree = "<group>"; };
D2B1E3E422F37D6A0065F95C /* ImageHeadlineBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageHeadlineBody.swift; sourceTree = "<group>"; }; D2B1E3E422F37D6A0065F95C /* ImageHeadlineBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageHeadlineBody.swift; sourceTree = "<group>"; };
D2C5001621F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIViewControllerMappingObject.h; sourceTree = "<group>"; }; D2C5001621F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIViewControllerMappingObject.h; sourceTree = "<group>"; };
D2C5001721F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIViewControllerMappingObject.m; sourceTree = "<group>"; }; D2C5001721F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MVMCoreUIViewControllerMappingObject.m; sourceTree = "<group>"; };
@ -455,6 +453,7 @@
D2E1FADA2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MVMCoreUIDelegateObject.swift; sourceTree = "<group>"; }; D2E1FADA2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MVMCoreUIDelegateObject.swift; sourceTree = "<group>"; };
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>"; };
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>"; };
@ -536,6 +535,39 @@
path = LabelModel; path = LabelModel;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
94FB5B83238D892800EB2193 /* Recovered References */ = {
isa = PBXGroup;
children = (
);
name = "Recovered References";
sourceTree = "<group>";
};
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 = "<group>";
};
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 = "<group>";
};
D224798823142BF2003FCCF9 /* SwitchMolecules */ = { D224798823142BF2003FCCF9 /* SwitchMolecules */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -595,17 +627,13 @@
path = Items; path = Items;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
D22D1F582204D2590077CEC0 /* LegacyControllers */ = { D22D1F582204D2590077CEC0 /* Legacy */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
D29DF29321E7ADB8003B2FB9 /* StackableViewController.h */, D213347523842FF5008E41B3 /* Views */,
D29DF28E21E7ADB8003B2FB9 /* StackableViewController.m */, D213347423842FE3008E41B3 /* Controllers */,
D29770F021F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.h */,
D29770F121F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsViewController.m */,
D29770EF21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.h */,
D29770EE21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.m */,
); );
path = LegacyControllers; path = Legacy;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
D29DF0C221E404D4003B2FB9 = { D29DF0C221E404D4003B2FB9 = {
@ -614,6 +642,7 @@
D29DF0CE21E404D4003B2FB9 /* MVMCoreUI */, D29DF0CE21E404D4003B2FB9 /* MVMCoreUI */,
D29DF0CD21E404D4003B2FB9 /* Products */, D29DF0CD21E404D4003B2FB9 /* Products */,
D29DF0E421E4F3C7003B2FB9 /* Frameworks */, D29DF0E421E4F3C7003B2FB9 /* Frameworks */,
94FB5B83238D892800EB2193 /* Recovered References */,
); );
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@ -638,7 +667,7 @@
D29DF13321E68604003B2FB9 /* Styles */, D29DF13321E68604003B2FB9 /* Styles */,
D29DF11021E6805F003B2FB9 /* Categories */, D29DF11021E6805F003B2FB9 /* Categories */,
D29DF11921E68467003B2FB9 /* Containers */, D29DF11921E68467003B2FB9 /* Containers */,
D22D1F582204D2590077CEC0 /* LegacyControllers */, D22D1F582204D2590077CEC0 /* Legacy */,
D29DF10F21E67A7D003B2FB9 /* BaseControllers */, D29DF10F21E67A7D003B2FB9 /* BaseControllers */,
D29DF11E21E6851E003B2FB9 /* TopAlert */, D29DF11E21E6851E003B2FB9 /* TopAlert */,
D29DF10E21E67A77003B2FB9 /* Molecules */, D29DF10E21E67A77003B2FB9 /* Molecules */,
@ -725,6 +754,7 @@
D29DF2CD21E7C104003B2FB9 /* MFLoadingViewController.m */, D29DF2CD21E7C104003B2FB9 /* MFLoadingViewController.m */,
D2A5146A2214905000345BFB /* ThreeLayerViewController.swift */, D2A5146A2214905000345BFB /* ThreeLayerViewController.swift */,
D2E1FADE2268B8E700AEFD8C /* ThreeLayerTableViewController.swift */, D2E1FADE2268B8E700AEFD8C /* ThreeLayerTableViewController.swift */,
D2F4DDE52371A4CB00CD28BB /* ViewController.swift */,
); );
path = BaseControllers; path = BaseControllers;
sourceTree = "<group>"; sourceTree = "<group>";
@ -746,8 +776,7 @@
children = ( children = (
D29DF2B721E7BE79003B2FB9 /* TabBarController */, D29DF2B721E7BE79003B2FB9 /* TabBarController */,
D29DF2B621E7BE66003B2FB9 /* SplitViewController */, D29DF2B621E7BE66003B2FB9 /* SplitViewController */,
D206997521FB8A0B00CAE0DE /* MVMCoreUINavigationController.h */, D2B18B93236214AD00A9AEDC /* NavigationController.swift */,
D206997621FB8A0B00CAE0DE /* MVMCoreUINavigationController.m */,
); );
path = Containers; path = Containers;
sourceTree = "<group>"; sourceTree = "<group>";
@ -838,20 +867,15 @@
DBC4391722442197001AB423 /* DashLine.swift */, DBC4391722442197001AB423 /* DashLine.swift */,
944589202385D6E900DE9FD4 /* DashLineModel.swift */, 944589202385D6E900DE9FD4 /* DashLineModel.swift */,
DB06250A2293456500B72DD3 /* LeftRightLabelView.swift */, DB06250A2293456500B72DD3 /* LeftRightLabelView.swift */,
D29DF17E21E69E2E003B2FB9 /* MFView.h */,
D29DF17F21E69E2E003B2FB9 /* MFView.m */,
D29DF31E21ED0CBA003B2FB9 /* LabelView.h */,
D29DF31F21ED0CBA003B2FB9 /* LabelView.m */,
D29DF28721E7AC2B003B2FB9 /* ViewConstrainingView.h */, D29DF28721E7AC2B003B2FB9 /* ViewConstrainingView.h */,
D29DF28821E7AC2B003B2FB9 /* ViewConstrainingView.m */, D29DF28821E7AC2B003B2FB9 /* ViewConstrainingView.m */,
D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */, D282AAB9224131D100C46919 /* MFTransparentGIFView.swift */,
D282AAB3223FDDAE00C46919 /* MFLoadImageView.swift */, D282AAB3223FDDAE00C46919 /* MFLoadImageView.swift */,
944589222385DA9500DE9FD4 /* ImageViewModel.swift */, 944589222385DA9500DE9FD4 /* ImageViewModel.swift */,
D213347623843825008E41B3 /* Line.swift */,
D29DF2AD21E7B3A4003B2FB9 /* MFTextView.h */, D29DF2AD21E7B3A4003B2FB9 /* MFTextView.h */,
D29DF2AB21E7B3A4003B2FB9 /* MFTextView.m */, D29DF2AB21E7B3A4003B2FB9 /* MFTextView.m */,
D29DF2AC21E7B3A4003B2FB9 /* MFTextView.xib */, D29DF2AC21E7B3A4003B2FB9 /* MFTextView.xib */,
D29DF15921E697DA003B2FB9 /* SeparatorView.h */,
D29DF15A21E697DA003B2FB9 /* SeparatorView.m */,
D29DF2B121E7B76C003B2FB9 /* MFLoadingSpinner.h */, D29DF2B121E7B76C003B2FB9 /* MFLoadingSpinner.h */,
D29DF2B221E7B76D003B2FB9 /* MFLoadingSpinner.m */, D29DF2B221E7B76D003B2FB9 /* MFLoadingSpinner.m */,
D29DF32321ED0DA2003B2FB9 /* TextButtonView.h */, D29DF32321ED0DA2003B2FB9 /* TextButtonView.h */,
@ -919,8 +943,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
D2E1FADA2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift */, D2E1FADA2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift */,
D28B4F8821FF967C00712C7A /* MVMCoreUIObject.h */, D2B18B912361E65A00A9AEDC /* CoreUIObject.swift */,
D28B4F8921FF967C00712C7A /* MVMCoreUIObject.m */,
D29DF27721E7A533003B2FB9 /* MVMCoreUISession.h */, D29DF27721E7A533003B2FB9 /* MVMCoreUISession.h */,
D29DF27821E7A533003B2FB9 /* MVMCoreUISession.m */, D29DF27821E7A533003B2FB9 /* MVMCoreUISession.m */,
D29DF27321E79E81003B2FB9 /* MVMCoreUILoggingHandler.h */, D29DF27321E79E81003B2FB9 /* MVMCoreUILoggingHandler.h */,
@ -1013,7 +1036,6 @@
D260D7B622D68514007E7233 /* MVMCoreUIPagingProtocol.h in Headers */, D260D7B622D68514007E7233 /* MVMCoreUIPagingProtocol.h in Headers */,
D29DF18021E69E49003B2FB9 /* MFView.h in Headers */, D29DF18021E69E49003B2FB9 /* MFView.h in Headers */,
D29DF27921E7A533003B2FB9 /* MVMCoreUISession.h in Headers */, D29DF27921E7A533003B2FB9 /* MVMCoreUISession.h in Headers */,
D206997721FB8A0B00CAE0DE /* MVMCoreUINavigationController.h in Headers */,
D29DF29D21E7AE38003B2FB9 /* MFStyler.h in Headers */, D29DF29D21E7AE38003B2FB9 /* MFStyler.h in Headers */,
D29DF2B021E7B3A4003B2FB9 /* MFTextView.h in Headers */, D29DF2B021E7B3A4003B2FB9 /* MFTextView.h in Headers */,
D29DF2A921E7B2F9003B2FB9 /* MVMCoreUIConstants.h in Headers */, D29DF2A921E7B2F9003B2FB9 /* MVMCoreUIConstants.h in Headers */,
@ -1056,7 +1078,6 @@
D29DF13121E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.h in Headers */, D29DF13121E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.h in Headers */,
D29DF2C421E7BF57003B2FB9 /* MFTabBarSwipeAnimator.h in Headers */, D29DF2C421E7BF57003B2FB9 /* MFTabBarSwipeAnimator.h in Headers */,
D2A5145D2211D22A00345BFB /* MVMCoreUIMoleculeViewProtocol.h in Headers */, D2A5145D2211D22A00345BFB /* MVMCoreUIMoleculeViewProtocol.h in Headers */,
D28B4F8A21FF967C00712C7A /* MVMCoreUIObject.h in Headers */,
D29DF2CA21E7BFC8003B2FB9 /* MFSizeThreshold.h in Headers */, D29DF2CA21E7BFC8003B2FB9 /* MFSizeThreshold.h in Headers */,
D29DF28021E7AA51003B2FB9 /* MVMCoreUIDetailViewProtocol.h in Headers */, D29DF28021E7AA51003B2FB9 /* MVMCoreUIDetailViewProtocol.h in Headers */,
D29DF2BD21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.h in Headers */, D29DF2BD21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.h in Headers */,
@ -1213,19 +1234,20 @@
D29DF25421E6A177003B2FB9 /* MFMdnTextField.m in Sources */, D29DF25421E6A177003B2FB9 /* MFMdnTextField.m in Sources */,
D282AABA224131D100C46919 /* MFTransparentGIFView.swift in Sources */, D282AABA224131D100C46919 /* MFTransparentGIFView.swift in Sources */,
944589232385DA9600DE9FD4 /* ImageViewModel.swift in Sources */, 944589232385DA9600DE9FD4 /* ImageViewModel.swift in Sources */,
D213347723843825008E41B3 /* Line.swift in Sources */,
D2A514672213885800345BFB /* StandardHeaderView.swift in Sources */, D2A514672213885800345BFB /* StandardHeaderView.swift in Sources */,
01EB369023609801006832FA /* ListItemModel.swift in Sources */, 01EB369023609801006832FA /* ListItemModel.swift in Sources */,
DBEFFA04225A829700230692 /* Label.swift in Sources */, DBEFFA04225A829700230692 /* Label.swift in Sources */,
D2D6CD4022E78C1A00D701B8 /* Scroller.swift in Sources */, D2D6CD4022E78C1A00D701B8 /* Scroller.swift in Sources */,
01509D952327ED1900EF99AA /* HeadlineBodyTextButtonSwitch.swift in Sources */, 01509D952327ED1900EF99AA /* HeadlineBodyTextButtonSwitch.swift in Sources */,
D29DF13021E6851E003B2FB9 /* MVMCoreUITopAlertShortView.m in Sources */, D29DF13021E6851E003B2FB9 /* MVMCoreUITopAlertShortView.m in Sources */,
D28B4F8B21FF967C00712C7A /* MVMCoreUIObject.m in Sources */,
0A1B4A96233BB18F005B3FB4 /* CheckboxWithLabelView.swift in Sources */, 0A1B4A96233BB18F005B3FB4 /* CheckboxWithLabelView.swift in Sources */,
D260D7B222D65BDD007E7233 /* MVMCoreUIPageControl.m in Sources */, D260D7B222D65BDD007E7233 /* MVMCoreUIPageControl.m in Sources */,
D2B18B812360945C00A9AEDC /* View.swift in Sources */, D2B18B812360945C00A9AEDC /* View.swift in Sources */,
D29DF26D21E6AA0B003B2FB9 /* FLAnimatedImageView.m in Sources */, D29DF26D21E6AA0B003B2FB9 /* FLAnimatedImageView.m in Sources */,
D29DF2EF21ECEAE1003B2FB9 /* MFFonts.m in Sources */, D29DF2EF21ECEAE1003B2FB9 /* MFFonts.m in Sources */,
D22479942316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift in Sources */, D22479942316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift in Sources */,
D2B18B94236214AD00A9AEDC /* NavigationController.swift in Sources */,
D282AACB2243C61700C46919 /* ButtonView.swift in Sources */, D282AACB2243C61700C46919 /* ButtonView.swift in Sources */,
D2D6CD4222E78FAB00D701B8 /* ThreeLayerTemplate.swift in Sources */, D2D6CD4222E78FAB00D701B8 /* ThreeLayerTemplate.swift in Sources */,
01EB368F23609801006832FA /* LabelModel.swift in Sources */, 01EB368F23609801006832FA /* LabelModel.swift in Sources */,
@ -1244,7 +1266,6 @@
D29DF2BF21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.m in Sources */, D29DF2BF21E7BEA4003B2FB9 /* MVMCoreUITabBarPageControlViewController.m in Sources */,
D29DF28321E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.m in Sources */, D29DF28321E7AB24003B2FB9 /* MVMCoreUICommonViewsUtility.m in Sources */,
94C2D9842386F3F80006CF46 /* LabelAttributeModel.swift in Sources */, 94C2D9842386F3F80006CF46 /* LabelAttributeModel.swift in Sources */,
D206997821FB8A0B00CAE0DE /* MVMCoreUINavigationController.m in Sources */,
944589212385D6E900DE9FD4 /* DashLineModel.swift in Sources */, 944589212385D6E900DE9FD4 /* DashLineModel.swift in Sources */,
D29DF27A21E7A533003B2FB9 /* MVMCoreUISession.m in Sources */, D29DF27A21E7A533003B2FB9 /* MVMCoreUISession.m in Sources */,
01DF55E021F8FAA800CC099B /* MFTextFieldListView.swift in Sources */, 01DF55E021F8FAA800CC099B /* MFTextFieldListView.swift in Sources */,
@ -1293,6 +1314,7 @@
0105618E224BBE7700E1557D /* FormValidator+TextFields.swift in Sources */, 0105618E224BBE7700E1557D /* FormValidator+TextFields.swift in Sources */,
0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */, 0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */,
01EB369123609801006832FA /* MoleculeStackItemModel.swift in Sources */, 01EB369123609801006832FA /* MoleculeStackItemModel.swift in Sources */,
D2B18B922361E65A00A9AEDC /* CoreUIObject.swift in Sources */,
D29DF2BE21E7BEA4003B2FB9 /* TopTabbar.m in Sources */, D29DF2BE21E7BEA4003B2FB9 /* TopTabbar.m in Sources */,
D2A514632213643100345BFB /* MoleculeStackCenteredTemplate.swift in Sources */, D2A514632213643100345BFB /* MoleculeStackCenteredTemplate.swift in Sources */,
D29DF32421ED0DA2003B2FB9 /* TextButtonView.m in Sources */, D29DF32421ED0DA2003B2FB9 /* TextButtonView.m in Sources */,

View File

@ -8,8 +8,7 @@
// //
open class CaretView: MFView, ModelMoleculeViewProtocol { open class CaretView: View {
//------------------------------------------------------ //------------------------------------------------------
// MARK: - Properties // MARK: - Properties
//------------------------------------------------------ //------------------------------------------------------
@ -27,7 +26,7 @@ open class CaretView: MFView, ModelMoleculeViewProtocol {
// MARK: - Initialization // MARK: - Initialization
//------------------------------------------------------ //------------------------------------------------------
@objc public init() { @objc public override init() {
super.init(frame: .zero) super.init(frame: .zero)
} }
@ -100,7 +99,7 @@ open class CaretView: MFView, ModelMoleculeViewProtocol {
//------------------------------------------------------ //------------------------------------------------------
// Default values for view. // Default values for view.
@objc open override func setAsMolecule() { @objc open func setAsMolecule() {
defaultState() defaultState()
} }
@ -125,12 +124,14 @@ open class CaretView: MFView, ModelMoleculeViewProtocol {
lineWidth = lineWidthValue lineWidth = lineWidthValue
} }
} }
}
open override func needsToBeConstrained() -> Bool { extension CaretView: MVMCoreUIViewConstrainingProtocol {
open func needsToBeConstrained() -> Bool {
return true return true
} }
open override func alignment() -> UIStackView.Alignment { open func alignment() -> UIStackView.Alignment {
return UIStackView.Alignment.leading; return UIStackView.Alignment.leading;
} }

View File

@ -10,7 +10,7 @@
import MVMCore import MVMCore
open class DashLine: MFView, ModelMoleculeViewProtocol { open class DashLine: View {
//------------------------------------------------------ //------------------------------------------------------
// MARK: - Properties // MARK: - Properties
//------------------------------------------------------ //------------------------------------------------------
@ -64,8 +64,7 @@ open class DashLine: MFView, ModelMoleculeViewProtocol {
//------------------------------------------------------ //------------------------------------------------------
// Default values for view. // Default values for view.
@objc open override func setAsMolecule() { @objc open func setAsMolecule() {
backgroundColor = .clear backgroundColor = .clear
isHidden = false isHidden = false
} }

View File

@ -109,7 +109,7 @@ public struct GraphObject {
} }
@objcMembers open class GraphView: View { @objcMembers open class GraphView: View, MVMCoreUIViewConstrainingProtocol {
var heightConstraint: NSLayoutConstraint? var heightConstraint: NSLayoutConstraint?
var gradientLayer: CALayer? var gradientLayer: CALayer?
@ -240,6 +240,10 @@ public struct GraphObject {
return containLayer return containLayer
} }
//MARK: MVMCoreUIViewConstrainingProtocol
public func needsToBeConstrained() -> Bool {
return true
}
//MARK: Animation //MARK: Animation
func rotationAnimation(_ object: GraphObject) { func rotationAnimation(_ object: GraphObject) {

View File

@ -86,7 +86,6 @@ public typealias ActionBlock = () -> ()
//------------------------------------------------------ //------------------------------------------------------
@objc public func setupView() { @objc public func setupView() {
backgroundColor = .clear backgroundColor = .clear
numberOfLines = 0 numberOfLines = 0
lineBreakMode = .byWordWrapping lineBreakMode = .byWordWrapping

View File

@ -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
}
}

View File

@ -228,7 +228,9 @@ static const CGFloat CheckBoxHeightWidth = 18.0;
NSDictionary *constraints = [NSLayoutConstraint constraintPinView:checkedSquare heightConstraint:YES heightConstant:size widthConstraint:YES widthConstant:size]; NSDictionary *constraints = [NSLayoutConstraint constraintPinView:checkedSquare heightConstraint:YES heightConstant:size widthConstraint:YES widthConstant:size];
self.checkboxWidth = constraints[ConstraintWidth]; self.checkboxWidth = constraints[ConstraintWidth];
self.checkboxHeight = constraints[ConstraintHeight]; 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]; self.checkboxRightPinConstraint = [checkedSquare.trailingAnchor constraintEqualToAnchor:containterView.trailingAnchor];
@ -255,7 +257,7 @@ static const CGFloat CheckBoxHeightWidth = 18.0;
Label *descriptionLabel = [Label commonLabelB2:YES]; Label *descriptionLabel = [Label commonLabelB2:YES];
[containterView addSubview:descriptionLabel]; [containterView addSubview:descriptionLabel];
[NSLayoutConstraint constraintPinSubview:descriptionLabel pinCenterX:NO pinCenterY:YES]; [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 = [NSLayoutConstraint constraintWithItem:descriptionLabel attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.checkedSquare attribute:NSLayoutAttributeTrailing multiplier:1 constant:11];
self.descriptionLabelLeadingConstraint.active = YES; self.descriptionLabelLeadingConstraint.active = YES;

View File

@ -24,7 +24,7 @@ import UIKit
guard progressObject.progress > 0.0 else { guard progressObject.progress > 0.0 else {
continue continue
} }
let view = MFView(frame: .zero) let view = UIView(frame: .zero)
view.translatesAutoresizingMaskIntoConstraints = false view.translatesAutoresizingMaskIntoConstraints = false
addSubview(view) addSubview(view)
view.backgroundColor = UIColor.mfGet(forHex: progressObject.color) view.backgroundColor = UIColor.mfGet(forHex: progressObject.color)

View File

@ -35,7 +35,6 @@
#import "MVMCoreUISession.h" #import "MVMCoreUISession.h"
#import "MVMCoreUILoggingHandler.h" #import "MVMCoreUILoggingHandler.h"
#import "MVMCoreUITabBarPageControlViewController.h" #import "MVMCoreUITabBarPageControlViewController.h"
#import "MVMCoreUINavigationController.h"
#import <MVMCoreUI/MVMCoreUI-Swift.h> #import <MVMCoreUI/MVMCoreUI-Swift.h>
@import MVMAnimationFramework; @import MVMAnimationFramework;

View File

@ -62,6 +62,8 @@ extern NSString * _Nonnull const ConstraintWidth;
#pragma mark - With Margins #pragma mark - With Margins
+ (nonnull NSDictionary <NSString *, NSLayoutConstraint *>*)pinViewToSuperview:(nonnull UIView *)subview useMargins:(BOOL)useMargins; + (nonnull NSDictionary <NSString *, NSLayoutConstraint *>*)pinViewToSuperview:(nonnull UIView *)subview useMargins:(BOOL)useMargins;
+ (nonnull NSDictionary <NSString *, NSLayoutConstraint *>*)pinViewToSuperview:(nonnull UIView *)subview useMargins:(BOOL)useMargins pinTop:(BOOL)pinTop pinBottom:(BOOL)pinBottom pinLeft:(BOOL)pinLeft pinRight:(BOOL)pinRight;
+ (nonnull NSDictionary <NSString *, NSLayoutConstraint *>*)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 *)pinViewTopToSuperview:(nonnull UIView *)view useMargins:(BOOL)useMargins constant:(CGFloat)constant;
+ (nonnull NSLayoutConstraint *)pinViewLeftToSuperview:(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; + (nonnull NSLayoutConstraint *)pinViewRightToSuperview:(nonnull UIView *)view useMargins:(BOOL)useMargins constant:(CGFloat)constant;

View File

@ -161,11 +161,28 @@ NSString *const ConstraintWidth = @"width";
#pragma mark - With Margins #pragma mark - With Margins
+ (nonnull NSDictionary *)pinViewToSuperview:(nonnull UIView *)subview useMargins:(BOOL)useMargins { + (nonnull NSDictionary *)pinViewToSuperview:(nonnull UIView *)subview useMargins:(BOOL)useMargins {
return @{ConstraintTop:[self pinViewTopToSuperview: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];
ConstraintLeading:[self pinViewLeftToSuperview:subview useMargins:useMargins constant:0], }
ConstraintTrailing:[self pinViewRightToSuperview:subview useMargins:useMargins constant:0],
ConstraintBot:[self pinViewBottomToSuperview:subview useMargins:useMargins constant: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 { + (NSLayoutConstraint *)pinViewTopToSuperview:(UIView *)view useMargins:(BOOL)useMargins constant:(CGFloat)constant {

View File

@ -1,28 +0,0 @@
//
// MVMCoreUINavigationController.h
// MVMCoreUI
//
// Created by Scott Pfeil on 1/25/19.
// Copyright © 2019 Verizon Wireless. All rights reserved.
//
#import <UIKit/UIKit.h>
@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

View File

@ -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

View File

@ -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
}
}

View File

@ -11,10 +11,9 @@
@import MVMCore.MVMCoreActionDelegateProtocol; @import MVMCore.MVMCoreActionDelegateProtocol;
#import <MVMCoreUI/MVMCoreUIPanelProtocol.h> #import <MVMCoreUI/MVMCoreUIPanelProtocol.h>
#import <MVMCoreUI/MVMCoreUIPanelButtonProtocol.h> #import <MVMCoreUI/MVMCoreUIPanelButtonProtocol.h>
@class MVMCoreUINavigationController;
@class MVMCoreUITopAlertView; @class MVMCoreUITopAlertView;
@class MFViewController; @class MFViewController;
@class NavigationController;
typedef NS_ENUM(NSInteger, MFNumberOfDrawers) { typedef NS_ENUM(NSInteger, MFNumberOfDrawers) {
MFNoDrawer = 0, MFNoDrawer = 0,
@ -34,7 +33,7 @@ typedef NS_ENUM(NSInteger, MFNumberOfDrawers) {
@property (nullable, strong, nonatomic) UIBarButtonItem *backButton; @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 // Reference to the top alert view
@property (nullable, weak, nonatomic) MVMCoreUITopAlertView *topAlertView; @property (nullable, weak, nonatomic) MVMCoreUITopAlertView *topAlertView;

View File

@ -23,7 +23,7 @@
#import "MVMCoreUIConstants.h" #import "MVMCoreUIConstants.h"
#import "MVMCoreUICommonViewsUtility.h" #import "MVMCoreUICommonViewsUtility.h"
#import "MVMCoreUITopAlertView.h" #import "MVMCoreUITopAlertView.h"
#import "MVMCoreUINavigationController.h" #import <MVMCoreUI/MVMCoreUI-Swift.h>
@interface MVMCoreUISplitViewController () @interface MVMCoreUISplitViewController ()
@ -50,7 +50,7 @@ typedef NS_OPTIONS(NSInteger, MFExtendedDrawer) {
@property (weak, nonatomic, readwrite) UIViewController <MVMCoreUIPanelProtocol> *leftPanel; @property (weak, nonatomic, readwrite) UIViewController <MVMCoreUIPanelProtocol> *leftPanel;
@property (weak, nonatomic, readwrite) UIViewController <MVMCoreUIPanelProtocol> *rightPanel; @property (weak, nonatomic, readwrite) UIViewController <MVMCoreUIPanelProtocol> *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. // A view that covers the detail view when the master is out.
@property (weak, nonatomic) IBOutlet UIView *mainViewCoverView; @property (weak, nonatomic) IBOutlet UIView *mainViewCoverView;
@ -802,7 +802,7 @@ CGFloat const PanelAnimationDuration = 0.2;
} }
// The main view. // The main view.
MVMCoreUINavigationController *navigationController = [MVMCoreUINavigationController setupNavigationController]; NavigationController *navigationController = [NavigationController setupNavigationController];
self.navigationController = navigationController; self.navigationController = navigationController;
self.automaticallyAdjustsScrollViewInsets = NO; self.automaticallyAdjustsScrollViewInsets = NO;

View File

@ -71,4 +71,6 @@
- (BOOL)bottomViewOutsideOfScroll; - (BOOL)bottomViewOutsideOfScroll;
//override for setting attributed headline and message //override for setting attributed headline and message
-(void)setHeadlineAndMessage; -(void)setHeadlineAndMessage;
- (nullable UIView *)topAccessoryView;
@end @end

View File

@ -31,6 +31,7 @@
@property (strong, nonatomic) UIView *footerViewOutsideOfScroll; @property (strong, nonatomic) UIView *footerViewOutsideOfScroll;
@property (strong, nonatomic) NSLayoutConstraint *bottomViewTopConstraint; @property (strong, nonatomic) NSLayoutConstraint *bottomViewTopConstraint;
@property (strong, nonatomic) UIView *headerAccessoryView; @property (strong, nonatomic) UIView *headerAccessoryView;
@property (strong, nonatomic) UIView *topAccessoryView;
@end @end
@ -70,6 +71,9 @@
} }
} }
- (nullable UIView *)topAccessoryView {
return nil;
}
- (void)newDataBuildScreen { - (void)newDataBuildScreen {
[super newDataBuildScreen]; [super newDataBuildScreen];
@ -254,15 +258,25 @@
[header addSubview:topView]; [header addSubview:topView];
[header addSubview:headerAccessoryView]; [header addSubview:headerAccessoryView];
// Sets up the constraints UIView *topAccessoryView = [self topAccessoryView];
if (headerAccessoryView) { self.topAccessoryView = topAccessoryView;
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topView]-0-[headerAccessoryView]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(topView,headerAccessoryView)]]; if (topAccessoryView) {
[NSLayoutConstraint constraintPinSubview:topView pinTop:YES topConstant:0 pinBottom:NO bottomConstant:0 pinLeft:YES leftConstant:0 pinRight:YES rightConstant:0]; [header addSubview:topAccessoryView];
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]]; [NSLayoutConstraint constraintPinSubview:topAccessoryView pinTop:YES pinBottom:NO pinLeft:YES pinRight:YES];
} [topAccessoryView.bottomAnchor constraintEqualToAnchor:topView.topAnchor constant:0].active = YES;
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]];
} 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; self.headerView = header;
} }
@ -281,6 +295,7 @@
self.footerView = footer; self.footerView = footer;
} }
- (void)showHeader { - (void)showHeader {
if (self.headerView) { if (self.headerView) {
@ -459,6 +474,10 @@
#pragma mark - Animation #pragma mark - Animation
-(void)setupIntroAnimations { -(void)setupIntroAnimations {
if (self.topAccessoryView.subviews.count) {
[self.introAnimationManager addAnimationWithAnimation:[MVMAnimations fadeUpAnimationWithView:self.topAccessoryView]];
}
if (self.topView.subviews.count) { if (self.topView.subviews.count) {
[self.introAnimationManager addAnimationWithAnimation:[MVMAnimations fadeUpAnimationWithView:self.topView]]; [self.introAnimationManager addAnimationWithAnimation:[MVMAnimations fadeUpAnimationWithView:self.topView]];
} }

View File

@ -38,6 +38,8 @@
#pragma mark - Subclass #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 // Allow you to add any additional ui before buildViewsBetweenLabelsAndButtons gets called. Can use this to set the topBetweenEdgeView or bottomBetweenEdgeView
- (void)buildInAdditionalViewsBeforeCenteredContent; - (void)buildInAdditionalViewsBeforeCenteredContent;
// For subclassing. Should return all the views that will be in between labels and buttons. Override standardSpaceAroundUIObject to handle spacing. // For subclassing. Should return all the views that will be in between labels and buttons. Override standardSpaceAroundUIObject to handle spacing.

View File

@ -31,6 +31,8 @@
@property (nullable, weak, nonatomic) UIView *betweenView; @property (nullable, weak, nonatomic) UIView *betweenView;
@property (strong, nonatomic) UIView *topAccessoryView;
// Adds the button view to the screen. Out of the scroll or in. // Adds the button view to the screen. Out of the scroll or in.
- (void)addViewOutsideOfScrollView:(UIView *)bottomView; - (void)addViewOutsideOfScrollView:(UIView *)bottomView;
- (void)addViewToContentView:(UIView *)bottomView; - (void)addViewToContentView:(UIView *)bottomView;
@ -115,9 +117,19 @@
} }
[self.contentView addSubview:topView]; [self.contentView addSubview:topView];
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[topView]-0-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(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];
self.topConstraintForTopView.active = YES;
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. // Checks if we are using a different object than the bottom buttons.
UIView *bottomView = [self useCustomViewInsteadOfButtons]; UIView *bottomView = [self useCustomViewInsteadOfButtons];
self.customBottemView = (bottomView != nil); self.customBottemView = (bottomView != nil);
@ -266,7 +278,10 @@
if (self.topLabelsView) { if (self.topLabelsView) {
[self.topLabelsView setHeadlineString:[[self mapForTopLabels] stringForKey:KeyTitle] messageString:[[self mapForTopLabels] stringForKey:KeyMessage]]; [self.topLabelsView setHeadlineString:[[self mapForTopLabels] stringForKey:KeyTitle] messageString:[[self mapForTopLabels] stringForKey:KeyMessage]];
} }
}
- (nullable UIView *)topAccessoryView {
return nil;
} }
- (void)updateViewConstraints { - (void)updateViewConstraints {
@ -409,6 +424,11 @@
#pragma mark - Animations #pragma mark - Animations
-(void)setupIntroAnimations { -(void)setupIntroAnimations {
if (self.topAccessoryView.subviews.count) {
[self.introAnimationManager addAnimationWithAnimation:[MVMAnimations fadeUpAnimationWithView:self.topAccessoryView]];
}
if (self.topView.subviews) { if (self.topView.subviews) {
[self.introAnimationManager addAnimationWithAnimation:[MVMAnimations fadeUpAnimationWithView:self.topView]]; [self.introAnimationManager addAnimationWithAnimation:[MVMAnimations fadeUpAnimationWithView:self.topView]];
} }

View File

@ -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 <MVMCoreUI/PublicHeader.h> // In this header, you should import all the public headers of your framework using statements like #import <MVMCoreUI/PublicHeader.h>
#pragma mark - OtherHandlers #pragma mark - OtherHandlers
#import <MVMCoreUI/MVMCoreUIObject.h>
#import <MVMCoreUI/MVMCoreUISession.h> #import <MVMCoreUI/MVMCoreUISession.h>
#import <MVMCoreUI/MVMCoreUILoggingHandler.h> #import <MVMCoreUI/MVMCoreUILoggingHandler.h>
#import <MVMCoreUI/MVMCoreUIViewControllerMappingObject.h> #import <MVMCoreUI/MVMCoreUIViewControllerMappingObject.h>
@ -59,8 +58,6 @@ FOUNDATION_EXPORT const unsigned char MVMCoreUIVersionString[];
#import <MVMCoreUI/TopLabelsAndBottomButtonsTableViewController.h> #import <MVMCoreUI/TopLabelsAndBottomButtonsTableViewController.h>
#pragma mark - Containers #pragma mark - Containers
#import <MVMCoreUI/MVMCoreUINavigationController.h>
#import <MVMCoreUI/MVMCoreUIPanelProtocol.h> #import <MVMCoreUI/MVMCoreUIPanelProtocol.h>
#import <MVMCoreUI/MVMCoreUIDetailViewProtocol.h> #import <MVMCoreUI/MVMCoreUIDetailViewProtocol.h>
#import <MVMCoreUI/MVMCoreUIPanelButtonProtocol.h> #import <MVMCoreUI/MVMCoreUIPanelButtonProtocol.h>

View File

@ -21,8 +21,8 @@ import UIKit
private var caretViewHeightSizeObject: MFSizeObject? private var caretViewHeightSizeObject: MFSizeObject?
// For separation between cells. // For separation between cells.
public var topSeparatorView: SeparatorView? public var topSeparatorView: Line?
public var bottomSeparatorView: SeparatorView? public var bottomSeparatorView: Line?
public enum SeparatorFrequency: String { public enum SeparatorFrequency: String {
case all case all
case allExceptTop case allExceptTop
@ -57,21 +57,22 @@ import UIKit
open func styleStandard() { open func styleStandard() {
topMarginPadding = 24 topMarginPadding = 24
bottomMarginPadding = 24 bottomMarginPadding = 24
bottomSeparatorView?.show() topSeparatorView?.style = .none
bottomSeparatorView?.setAsLight() bottomSeparatorView?.style = .standard
} }
open func styleHeader() { open func styleHeader() {
topMarginPadding = 48 topMarginPadding = 48
bottomMarginPadding = 16 bottomMarginPadding = 16
bottomSeparatorView?.show() topSeparatorView?.style = .none
bottomSeparatorView?.setAsRegular() bottomSeparatorView?.style = .thin
} }
open func styleNone() { open func styleNone() {
topMarginPadding = 0 topMarginPadding = 0
bottomMarginPadding = 0 bottomMarginPadding = 0
bottomSeparatorView?.hide() topSeparatorView?.style = .none
bottomSeparatorView?.style = .none
} }
/// Adds the molecule to the view. /// Adds the molecule to the view.
@ -111,23 +112,25 @@ import UIKit
// MARK: - MFViewProtocol // MARK: - MFViewProtocol
public func updateView(_ size: CGFloat) { public func updateView(_ size: CGFloat) {
MFStyler.setMarginsFor(self, size: size, defaultHorizontal: updateViewHorizontalDefaults, top: topMarginPadding, bottom: bottomMarginPadding) MFStyler.setMarginsFor(self, size: size, defaultHorizontal: updateViewHorizontalDefaults, top: topMarginPadding, bottom: bottomMarginPadding)
if accessoryView != nil { if accessoryView != nil {
// Smaller left margin if accessory view. // Smaller left margin if accessory view.
var margin = directionalLayoutMargins var margin = directionalLayoutMargins
margin.trailing = 16 margin.trailing = 16
contentView.directionalLayoutMargins = margin contentView.directionalLayoutMargins = margin
// 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 { } else {
contentView.directionalLayoutMargins = directionalLayoutMargins 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) topSeparatorView?.updateView(size)
bottomSeparatorView?.updateView(size) bottomSeparatorView?.updateView(size)
molecule?.updateView(size)
} }
public func setupView() { public func setupView() {
@ -256,8 +259,8 @@ import UIKit
setSeparatorFrequency(separatorFrequency, indexPath: indexPath) setSeparatorFrequency(separatorFrequency, indexPath: indexPath)
} }
} else { } else {
topSeparatorView?.hide() topSeparatorView?.style = .standard
bottomSeparatorView?.setAsLight() bottomSeparatorView?.style = .standard
setSeparatorFrequency(TableViewCell.SeparatorFrequency.allExceptTop, indexPath: indexPath) setSeparatorFrequency(TableViewCell.SeparatorFrequency.allExceptTop, indexPath: indexPath)
} }
} }
@ -275,12 +278,22 @@ import UIKit
// MARK: - Separator // MARK: - Separator
open func addSeparatorsIfNeeded() { open func addSeparatorsIfNeeded() {
if topSeparatorView == nil { if topSeparatorView == nil {
topSeparatorView = SeparatorView.separatorAdd(to: self, position: SeparatorPositionTop) let line = Line()
topSeparatorView?.hide() 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 { if bottomSeparatorView == nil {
bottomSeparatorView = SeparatorView.separatorAdd(to: self, position: SeparatorPositionBot) let line = Line()
bottomSeparatorView?.hide() 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
} }
} }
@ -289,26 +302,26 @@ import UIKit
switch separatorFrequency { switch separatorFrequency {
case .all: case .all:
if indexPath.row == 0 { if indexPath.row == 0 {
topSeparatorView?.show() topSeparatorView?.isHidden = false
} else { } else {
topSeparatorView?.hide() topSeparatorView?.isHidden = true
} }
bottomSeparatorView?.show() bottomSeparatorView?.isHidden = false
case .allExceptBottom: case .allExceptBottom:
topSeparatorView?.show() topSeparatorView?.isHidden = false
bottomSeparatorView?.hide() bottomSeparatorView?.isHidden = true
case .between: case .between:
if indexPath.row == 0 { if indexPath.row == 0 {
topSeparatorView?.hide() topSeparatorView?.isHidden = true
} else { } else {
topSeparatorView?.show() topSeparatorView?.isHidden = false
} }
bottomSeparatorView?.hide() bottomSeparatorView?.isHidden = true
case .allExceptTop: case .allExceptTop:
fallthrough fallthrough
default: default:
topSeparatorView?.hide() topSeparatorView?.isHidden = true
bottomSeparatorView?.show() bottomSeparatorView?.isHidden = false
} }
} }
} }

View File

@ -8,14 +8,13 @@
import UIKit import UIKit
public class StandardHeaderView: ViewConstrainingView, ModelMoleculeViewProtocol { public class StandardHeaderView: ViewConstrainingView {
var line: Line?
var separatorView: SeparatorView?
// MARK: - MVMCoreViewProtocol // MARK: - MVMCoreViewProtocol
open override func updateView(_ size: CGFloat) { open override func updateView(_ size: CGFloat) {
super.updateView(size) super.updateView(size)
separatorView?.updateView(size) line?.updateView(size)
} }
public override func setupView() { public override func setupView() {
@ -25,21 +24,15 @@ public class StandardHeaderView: ViewConstrainingView, ModelMoleculeViewProtocol
updateViewHorizontalDefaults = true updateViewHorizontalDefaults = true
topMarginPadding = PaddingDefaultVerticalSpacing topMarginPadding = PaddingDefaultVerticalSpacing
bottomMarginPadding = 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) { guard line == nil else { return }
super.setLeftPinConstant(constant) let line = Line()
separatorView?.leftPin?.constant = constant line.style = .heavy
} addSubview(line)
NSLayoutConstraint.pinViewBottom(toSuperview: line, useMargins: false, constant: 0).isActive = true
public override func setRightPinConstant(_ constant: CGFloat) { NSLayoutConstraint.pinViewLeft(toSuperview: line, useMargins: true, constant: 0).isActive = true
super.setRightPinConstant(constant) NSLayoutConstraint.pinViewRight(toSuperview: line, useMargins: true, constant: 0).isActive = true
separatorView?.rightPin?.constant = constant self.line = line
} }
// MARK: - MVMCoreUIMoleculeViewProtocol // MARK: - MVMCoreUIMoleculeViewProtocol
@ -51,7 +44,7 @@ public class StandardHeaderView: ViewConstrainingView, ModelMoleculeViewProtocol
(molecule as? MVMCoreUIViewConstrainingProtocol)?.shouldSetVerticalMargins?(false) (molecule as? MVMCoreUIViewConstrainingProtocol)?.shouldSetVerticalMargins?(false)
if let separatorJSON = json?.optionalDictionaryForKey("separator") { if let separatorJSON = json?.optionalDictionaryForKey("separator") {
separatorView?.setWithJSON(separatorJSON, delegateObject: delegateObject, additionalData: additionalData) line?.setWithJSON(separatorJSON, delegateObject: delegateObject, additionalData: additionalData)
} }
} }
@ -68,7 +61,7 @@ public class StandardHeaderView: ViewConstrainingView, ModelMoleculeViewProtocol
} }
if let seperatorModel = headerModel.seperator as? LineModel { if let seperatorModel = headerModel.seperator as? LineModel {
separatorView?.setWithJSON(seperatorModel.toJSON(), delegateObject: delegateObject, additionalData: additionalData) line?.setWithJSON(seperatorModel.toJSON(), delegateObject: delegateObject, additionalData: additionalData)
} }
} }
@ -76,8 +69,7 @@ public class StandardHeaderView: ViewConstrainingView, ModelMoleculeViewProtocol
super.reset() super.reset()
topMarginPadding = PaddingDefaultVerticalSpacing topMarginPadding = PaddingDefaultVerticalSpacing
bottomMarginPadding = PaddingDefaultVerticalSpacing bottomMarginPadding = PaddingDefaultVerticalSpacing
separatorView?.setAsHeavy() line?.style = .heavy
separatorView?.show()
} }
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,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()
}
}

View File

@ -11,7 +11,6 @@
@import MVMCore.NSDictionary_MFConvenience; @import MVMCore.NSDictionary_MFConvenience;
@import MVMCore.MVMCoreLoadObject; @import MVMCore.MVMCoreLoadObject;
@import MVMCore.MVMCoreErrorObject; @import MVMCore.MVMCoreErrorObject;
#import "MVMCoreUIObject.h"
#import <MVMCoreUI/MVMCoreUI-Swift.h> #import <MVMCoreUI/MVMCoreUI-Swift.h>
#import "MFTextField.h" #import "MFTextField.h"
#import "MVMCoreUIPageControl.h" #import "MVMCoreUIPageControl.h"
@ -28,7 +27,7 @@
dispatch_once(&onceToken, ^{ dispatch_once(&onceToken, ^{
mapping = [@{ mapping = [@{
@"label": Label.class, @"label": Label.class,
@"line": SeparatorView.class, @"line": Line.class,
@"button": ButtonView.class, @"button": ButtonView.class,
@"textButton": MFTextButton.class, @"textButton": MFTextButton.class,
@"header": StandardHeaderView.class, @"header": StandardHeaderView.class,
@ -45,7 +44,6 @@
@"progressbar": ProgressBar.class, @"progressbar": ProgressBar.class,
@"circleProgress": GraphView.class, @"circleProgress": GraphView.class,
@"multiProgressBar": MultiProgress.class, @"multiProgressBar": MultiProgress.class,
@"checkbox": MVMCoreUICheckBox.class,
@"radioButton": RadioButton.class, @"radioButton": RadioButton.class,
@"radioButtonLabel": RadioButtonLabel.class, @"radioButtonLabel": RadioButtonLabel.class,
@"listItem": MoleculeTableViewCell.class, @"listItem": MoleculeTableViewCell.class,
@ -74,7 +72,7 @@
} }
+ (nullable instancetype)sharedMappingObject { + (nullable instancetype)sharedMappingObject {
return [MVMCoreActionUtility initializerClassCheck:[MVMCoreUIObject sharedInstance].moleculeMap classToVerify:self]; return [MVMCoreActionUtility initializerClassCheck:[CoreUIObject sharedInstance].moleculeMap classToVerify:self];
} }
- (instancetype)init { - (instancetype)init {

View File

@ -1,20 +0,0 @@
//
// MVMCoreUIObject.h
// MVMCoreUI
//
// Created by Scott Pfeil on 1/28/19.
// Copyright © 2019 Verizon Wireless. All rights reserved.
//
#import <MVMCore/MVMCore.h>
#import <MVMCoreUI/MVMCoreUIMoleculeMappingObject.h>
NS_ASSUME_NONNULL_BEGIN
@interface MVMCoreUIObject : MVMCoreObject
@property (nullable, nonatomic, strong) MVMCoreUIMoleculeMappingObject *moleculeMap;
@end
NS_ASSUME_NONNULL_END

View File

@ -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

View File

@ -11,15 +11,15 @@
@class MVMCoreUITopAlertView; @class MVMCoreUITopAlertView;
@class MVMCoreUISplitViewController; @class MVMCoreUISplitViewController;
@class MFViewController; @class MFViewController;
@class MVMCoreUINavigationController;
@class MFLoadingViewController; @class MFLoadingViewController;
@class NavigationController;
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
@interface MVMCoreUISession : MVMCoreSessionObject @interface MVMCoreUISession : MVMCoreSessionObject
@property (weak, nonatomic, nullable) MVMCoreUITopAlertView *topAlertView; @property (weak, nonatomic, nullable) MVMCoreUITopAlertView *topAlertView;
@property (weak, nonatomic, nullable) MVMCoreUISplitViewController *splitViewController; @property (weak, nonatomic, nullable) MVMCoreUISplitViewController *splitViewController;
@property (weak, nonatomic, nullable) MVMCoreUINavigationController *navigationController; @property (weak, nonatomic, nullable) NavigationController *navigationController;
@property (weak, nonatomic, nullable) MFLoadingViewController *loadingViewController; @property (weak, nonatomic, nullable) MFLoadingViewController *loadingViewController;
/// Tracks the current page type the user is currently viewing. KVO compliant. /// Tracks the current page type the user is currently viewing. KVO compliant.

View File

@ -6,6 +6,7 @@
// Copyright © 2019 Verizon Wireless. All rights reserved. // Copyright © 2019 Verizon Wireless. All rights reserved.
// //
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#import <MVMCoreUI/MVMCoreUIMoleculeViewProtocol.h>
@protocol MoleculeDelegateProtocol <NSObject> @protocol MoleculeDelegateProtocol <NSObject>

View File

@ -80,14 +80,13 @@ open class MoleculeListTemplate: ThreeLayerTableViewController {
return UITableViewCell() return UITableViewCell()
} }
let delegate = delegateObject() as? MVMCoreUIDelegateObject let delegate = delegateObject() as? MVMCoreUIDelegateObject
let moleculeCell = cell as? MVMCoreUIMoleculeViewProtocol
moleculeCell?.reset?()
if let protocolCell = cell as? MoleculeListCellProtocol { if let protocolCell = cell as? MoleculeListCellProtocol {
protocolCell.setSeparatorWithJSON?(loadObject?.pageJSON?.optionalDictionaryForKey("separator"), delegateObject: delegate, additionalData: nil, indexPath: indexPath) protocolCell.setSeparatorWithJSON?(loadObject?.pageJSON?.optionalDictionaryForKey("separator"), delegateObject: delegate, additionalData: nil, indexPath: indexPath)
} }
if let protocolCell = cell as? MVMCoreUIMoleculeViewProtocol { moleculeCell?.setWithJSON(moleculeInfo.molecule, delegateObject: delegate, additionalData: nil)
protocolCell.reset?() moleculeCell?.updateView(tableView.bounds.width)
protocolCell.setWithJSON(moleculeInfo.molecule, delegateObject: delegate, additionalData: nil)
protocolCell.updateView(tableView.bounds.width)
}
return cell return cell
} }

View File

@ -9,7 +9,6 @@
#import "MVMCoreUIUtility.h" #import "MVMCoreUIUtility.h"
#import "MVMCoreUIConstants.h" #import "MVMCoreUIConstants.h"
#import "MVMCoreUISession.h" #import "MVMCoreUISession.h"
#import "MVMCoreUINavigationController.h"
#import "MVMCoreUISplitViewController.h" #import "MVMCoreUISplitViewController.h"
@import MVMCore.MVMCoreNavigationHandler; @import MVMCore.MVMCoreNavigationHandler;
@import MVMCore.MVMCoreGetterUtility; @import MVMCore.MVMCoreGetterUtility;