reset function.

standard spacing for cell molecule
MFTextField to view contstraining view
constraining protocol
This commit is contained in:
Pfeil, Scott Robert 2019-06-04 12:42:52 -04:00
parent 81df953669
commit 161f3e9f08
28 changed files with 151 additions and 41 deletions

View File

@ -38,6 +38,7 @@
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, ); }; };
D296E143229729C30051EBE7 /* MoleculeMappingObject+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D296E142229729C30051EBE7 /* MoleculeMappingObject+Extension.swift */; };
D296E14722A5984C0051EBE7 /* MVMCoreUIViewConstrainingProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D296E14622A597490051EBE7 /* MVMCoreUIViewConstrainingProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
D29770C821F7C4AE00B2F0D0 /* TopLabelsView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29770C621F7C4AE00B2F0D0 /* TopLabelsView.m */; };
D29770C921F7C4AE00B2F0D0 /* TopLabelsView.h in Headers */ = {isa = PBXBuildFile; fileRef = D29770C721F7C4AE00B2F0D0 /* TopLabelsView.h */; settings = {ATTRIBUTES = (Public, ); }; };
D29770F221F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D29770EE21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.m */; };
@ -202,6 +203,7 @@
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>"; };
D296E142229729C30051EBE7 /* MoleculeMappingObject+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MoleculeMappingObject+Extension.swift"; sourceTree = "<group>"; };
D296E14622A597490051EBE7 /* MVMCoreUIViewConstrainingProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUIViewConstrainingProtocol.h; sourceTree = "<group>"; };
D29770C621F7C4AE00B2F0D0 /* TopLabelsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TopLabelsView.m; sourceTree = "<group>"; };
D29770C721F7C4AE00B2F0D0 /* TopLabelsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TopLabelsView.h; sourceTree = "<group>"; };
D29770EE21F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TopLabelsAndBottomButtonsTableViewController.m; sourceTree = "<group>"; };
@ -664,6 +666,7 @@
D29DF27421E79E81003B2FB9 /* MVMCoreUILoggingHandler.m */,
D2C5001621F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.h */,
D2C5001721F8ECDD001DA659 /* MVMCoreUIViewControllerMappingObject.m */,
D296E14622A597490051EBE7 /* MVMCoreUIViewConstrainingProtocol.h */,
D296E1402295EBBA0051EBE7 /* MoleculeDelegateProtocol.h */,
D2A514562211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.h */,
D2A514572211C53C00345BFB /* MVMCoreUIMoleculeMappingObject.m */,
@ -768,6 +771,7 @@
D29DF2B321E7B76D003B2FB9 /* MFLoadingSpinner.h in Headers */,
D29DF32521ED0DA2003B2FB9 /* TextButtonView.h in Headers */,
D29DF25021E6A177003B2FB9 /* MFDigitTextBox.h in Headers */,
D296E14722A5984C0051EBE7 /* MVMCoreUIViewConstrainingProtocol.h in Headers */,
D29DF2C621E7BF57003B2FB9 /* MFTabBarInteractor.h in Headers */,
D29DF25721E6A177003B2FB9 /* MFTextField.h in Headers */,
D29DF17521E69E1F003B2FB9 /* ButtonDelegateProtocol.h in Headers */,

View File

@ -8,7 +8,7 @@
//
open class CaretButton: MFCustomButton, MVMCoreUIMoleculeViewProtocol {
open class CaretButton: MFCustomButton, MVMCoreUIMoleculeViewProtocol, MVMCoreUIViewConstrainingProtocol {
//------------------------------------------------------
// MARK: - Constants
@ -136,7 +136,7 @@ open class CaretButton: MFCustomButton, MVMCoreUIMoleculeViewProtocol {
return true
}
open func moleculeAlignment() -> UIStackView.Alignment {
open func alignment() -> UIStackView.Alignment {
return UIStackView.Alignment.leading;
}
}

View File

@ -10,7 +10,7 @@
#import <MVMCoreUI/MFView.h>
@class MFSizeObject;
@interface MFTextButton : MFCustomButton <MVMCoreViewProtocol, MVMCoreUIMoleculeViewProtocol>
@interface MFTextButton : MFCustomButton <MVMCoreViewProtocol, MVMCoreUIMoleculeViewProtocol, MVMCoreUIViewConstrainingProtocol>
@property (nonnull, strong, nonatomic) MFSizeObject *sizeObject;

View File

@ -12,6 +12,7 @@
#import "UIColor+MFConvenience.h"
#import "MVMCoreUISplitViewController.h"
#import "MVMCoreUIConstants.h"
#import <MVMCoreUI/MVMCoreUI-Swift.h>
@import MVMCore.MVMCoreDispatchUtility;
@import MVMCore.MVMCoreGetterUtility;
@import MVMCore.NSDictionary_MFConvenience;
@ -128,6 +129,10 @@
#pragma mark - MVMCoreUIMoleculeViewProtocol
- (void)reset {
[self setTitleColor:[UIColor mfTextButtonColor] forState:UIControlStateNormal];
}
- (void)setWithJSON:(NSDictionary *)json delegateObject:(MVMCoreUIDelegateObject *)delegateObject additionalData:(NSDictionary *)additionalData {
NSString *color = [json string:KeyTextColor];
if (color) {
@ -141,11 +146,13 @@
}
}
#pragma mark - MVMCoreUIViewConstrainingProtocol
- (BOOL)needsToBeConstrained {
return YES;
}
- (UIStackViewAlignment)moleculeAlignment {
- (UIStackViewAlignment)alignment {
return UIStackViewAlignmentLeading;
}

View File

@ -26,7 +26,7 @@ typedef enum : NSUInteger {
static CGFloat const PrimaryButtonHeight = 42.0;
static CGFloat const PrimaryButtonSmallHeight = 30.0;
@interface PrimaryButton : MFCustomButton <MFTextFieldDelegate, UITextFieldDelegate, MVMCoreViewProtocol, MVMCoreUIMoleculeViewProtocol>
@interface PrimaryButton : MFCustomButton <MFTextFieldDelegate, UITextFieldDelegate, MVMCoreViewProtocol, MVMCoreUIMoleculeViewProtocol, MVMCoreUIViewConstrainingProtocol>
@property (nonatomic, readonly, assign) PrimaryButtonType primaryButtonType; //use reset function to set

View File

@ -638,6 +638,10 @@
#pragma mark - Molecule protocol
- (void)reset {
[self setAsStandardCustom];
}
- (void)setAsStandardCustom {
// Default to standard look.
self.primaryButtonType = PrimaryButtonTypeCustom;

View File

@ -7,7 +7,7 @@
//
#import <UIKit/UIKit.h>
#import <MVMCoreUI/MFView.h>
#import <MVMCoreUI/ViewConstrainingView.h>
@class PrimaryButton;
@class MFTextField;
@ -28,7 +28,7 @@
@end
@interface MFTextField : MFView <MVMCoreUIMoleculeViewProtocol>
@interface MFTextField : ViewConstrainingView <MVMCoreUIMoleculeViewProtocol>
@property (nullable, weak, nonatomic) UIView *view;

View File

@ -40,17 +40,12 @@
#pragma mark - setup
- (void)updateView:(CGFloat)size {
[super updateView:size];
[MVMCoreDispatchUtility performBlockOnMainThread:^{
self.formLabel.font = [MFStyler fontB3];
self.label.font = [MFStyler fontForTextFieldUnderLabel];
[MFStyler styleTextField:self.textField];
[self.dashLine updateView:size];
if (self.isMolecule) {
[self setHorizontalPadding:[MFStyler defaultHorizontalPaddingForSize:size]];
} else {
[self setHorizontalPadding:0];
}
}];
}
@ -369,14 +364,16 @@
}];
}
- (void)setHorizontalPadding:(CGFloat)padding {
self.textContainerLeftPin.constant = padding;
self.errorLableLeftPin.constant = padding;
self.formLabelLeftPin.constant = padding;
self.textContainerRightPin.constant = padding;
self.errorLableRightPin.constant = padding;
self.formLabelRightPin.constant = padding;
- (void)setLeftPinConstant:(CGFloat)constant {
self.textContainerLeftPin.constant = constant;
self.errorLableLeftPin.constant = constant;
self.formLabelLeftPin.constant = constant;
}
- (void)setRightPinConstant:(CGFloat)constant {
self.textContainerRightPin.constant = constant;
self.errorLableRightPin.constant = constant;
self.formLabelRightPin.constant = constant;
}
- (void)dealloc {

View File

@ -133,7 +133,7 @@ open class CaretView: MFView {
return true
}
open override func moleculeAlignment() -> UIStackView.Alignment {
open override func alignment() -> UIStackView.Alignment {
return UIStackView.Alignment.leading;
}
}

View File

@ -10,7 +10,7 @@
import MVMCore
@objc open class Label: UILabel, MVMCoreViewProtocol, MVMCoreUIMoleculeViewProtocol {
@objc open class Label: UILabel, MVMCoreViewProtocol, MVMCoreUIMoleculeViewProtocol, MVMCoreUIViewConstrainingProtocol {
//------------------------------------------------------
// MARK: - Properties
//------------------------------------------------------
@ -295,14 +295,29 @@ import MVMCore
// MARK: - Atomization
//------------------------------------------------------
public func reset() {
text = nil
attributedText = nil
originalAttributedString = nil
styleB2(true)
}
@objc public func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
Label.setUILabel(self, withJSON: json, delegate: delegateObject, additionalData: additionalData)
originalAttributedString = attributedText
}
public func setAsMolecule() {
setContentHuggingPriority(.required, for: .vertical)
}
public func needsToBeConstrained() -> Bool {
return true;
}
public func alignment() -> UIStackView.Alignment {
return .leading
}
}
extension Label {

View File

@ -8,9 +8,10 @@
#import <UIKit/UIKit.h>
#import <MVMCoreUI/MVMCoreUIMoleculeViewProtocol.h>
#import <MVMCoreUI/MVMCoreUIViewConstrainingProtocol.h>
@import MVMCore.MVMCoreViewProtocol;
@interface MFView : UIView <MVMCoreViewProtocol, MVMCoreUIMoleculeViewProtocol>
@interface MFView : UIView <MVMCoreViewProtocol, MVMCoreUIMoleculeViewProtocol, MVMCoreUIViewConstrainingProtocol>
@property (nullable, nonatomic, strong) NSDictionary *json;

View File

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

View File

@ -70,6 +70,10 @@
#pragma mark - set up
- (void)reset {
[self setAsLight];
}
- (void)updateView:(CGFloat)size {
[super updateView:size];
self.height.constant = [self.heightSizeObject getValueBasedOnSize:size];

View File

@ -145,6 +145,12 @@
}
}
- (void)reset {
if ([self.constrainedView respondsToSelector:@selector(reset)]) {
[self.constrainedView performSelector:@selector(reset)];
}
}
#pragma mark - MVMCoreUIMoleculeViewProtocol
- (void)setAsMolecule {

View File

@ -20,6 +20,7 @@ FOUNDATION_EXPORT const unsigned char MVMCoreUIVersionString[];
#import <MVMCoreUI/MVMCoreUISession.h>
#import <MVMCoreUI/MVMCoreUILoggingHandler.h>
#import <MVMCoreUI/MVMCoreUIViewControllerMappingObject.h>
#import <MVMCoreUI/MVMCoreUIViewConstrainingProtocol.h>
#import <MVMCoreUI/MoleculeDelegateProtocol.h>
#import <MVMCoreUI/MoleculeListCellProtocol.h>
#import <MVMCoreUI/MVMCoreUIMoleculeMappingObject.h>

View File

@ -39,6 +39,10 @@ import UIKit
}
// MARK: - MVMCoreViewProtocol
open override func reset() {
primaryButton?.reset()
}
open override func updateView(_ size: CGFloat) {
super.updateView(size)
MVMCoreDispatchUtility.performBlock(onMainThread: {

View File

@ -12,21 +12,19 @@
@protocol MVMCoreUIMoleculeViewProtocol <NSObject, MVMCoreViewProtocol>
// Sets up the ui based on the json
/// Sets up the ui based on the json
- (void)setWithJSON:(nullable NSDictionary *)json delegateObject:(nullable MVMCoreUIDelegateObject *)delegateObject additionalData:(nullable NSDictionary *)additionalData;
@optional
// Called after init to provide an early setter for any molecule specific logic
/// Called after init to provide an early setter for any molecule specific logic
- (void)setAsMolecule;
// Notifies the creator that the view needs to be constrained in a view.
- (BOOL)needsToBeConstrained;
/// Resets to default state before set with json is called again.
- (void)reset;
// The alignment for the molecule if constrained.
- (UIStackViewAlignment)moleculeAlignment;
// For the molecule list to load more efficiently.
/// For the molecule list to load more efficiently.
+ (CGFloat)estimatedHeightForRow:(nullable NSDictionary *)json;
@end

View File

@ -41,7 +41,7 @@ import UIKit
// MARK: - MFViewProtocol
public func updateView(_ size: CGFloat) {
MFStyler.setDefaultMarginsFor(self, size: size)
MFStyler.setDefaultMarginsFor(self, size: size, horizontal: true, vertical: true)
if #available(iOS 11.0, *) {
contentView.directionalLayoutMargins = directionalLayoutMargins
topSeparatorView?.setLeftAndRightPinConstant(directionalLayoutMargins.leading)
@ -75,7 +75,16 @@ import UIKit
if molecule == nil {
if let moleculeView = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(forJSON: moleculeJSON, delegateObject: delegateObject, constrainIfNeeded: true) {
contentView.addSubview(moleculeView)
NSLayoutConstraint.activate(Array(NSLayoutConstraint.pinView(toSuperview: moleculeView, useMargins: moleculeView.needsToBeConstrained?() ?? false).values))
let standardConstraints = (moleculeView as? MVMCoreUIViewConstrainingProtocol)?.useStandardConstraints?() ?? true
NSLayoutConstraint.activate(Array(NSLayoutConstraint.pinView(toSuperview: moleculeView, useMargins: standardConstraints).values))
if standardConstraints {
let constraint = contentView.heightAnchor.constraint(equalToConstant: 80)
constraint.priority = .defaultLow
constraint.isActive = true
if let moleculeView = moleculeView as? ViewConstrainingView {
moleculeView.updateViewHorizontalDefaults = false
}
}
molecule = moleculeView
}
} else {
@ -97,6 +106,10 @@ import UIKit
}
}
public func reset() {
molecule?.reset?()
}
public static func estimatedHeight(forRow json: [AnyHashable : Any]?) -> CGFloat {
guard let moleculeJSON = json?.optionalDictionaryForKey(KeyMolecule),
let theClass = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(withJSON: moleculeJSON, delegateObject: nil),

View File

@ -101,4 +101,9 @@ public class StandardFooterView: ViewConstrainingView {
twoButtonView.setWithJSON(json?.optionalDictionaryForKey("twoButtonView"), delegateObject: delegateObject, additionalData: additionalData)
textButton.setWithJSON(json?.optionalDictionaryForKey("textButton"), delegateObject: delegateObject, additionalData: additionalData)
}
public override func reset() {
twoButtonView.reset()
textButton.reset()
}
}

View File

@ -19,6 +19,7 @@ public class StandardHeaderView: ViewConstrainingView {
var rightConstraintMessage: NSLayoutConstraint?
private var heightConstraint: NSLayoutConstraint?
// MARK: - MVMCoreViewProtocol
public override func updateView(_ size: CGFloat) {
super.updateView(size)
headlineLabel.updateView(size)
@ -74,6 +75,7 @@ public class StandardHeaderView: ViewConstrainingView {
}
}
// MARK: - Constraining
public func setSpacing() {
if headlineLabel.hasText && messageLabel.hasText {
spaceBetweenLabels?.constant = PaddingTwo
@ -110,6 +112,15 @@ public class StandardHeaderView: ViewConstrainingView {
separatorView?.rightPin?.constant = constant
}
open override func reset() {
backgroundColor = .clear
headlineLabel.styleH2(true)
messageLabel.styleB2(true)
separatorView?.setAsHeavy()
separatorView?.show()
}
// MARK: - MVMCoreUIMoleculeViewProtocol
open override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
if let colorString = json?.optionalStringForKey(KeyBackgroundColor) {

View File

@ -80,7 +80,7 @@ import UIKit
return true
}
public override func moleculeAlignment() -> UIStackView.Alignment {
public override func alignment() -> UIStackView.Alignment {
return UIStackView.Alignment.leading
}
}

View File

@ -113,7 +113,7 @@ import UIKit
return true
}
public override func moleculeAlignment() -> UIStackView.Alignment {
public override func alignment() -> UIStackView.Alignment {
return UIStackView.Alignment.leading
}
}

View File

@ -49,6 +49,11 @@ import UIKit
set(primaryButtonJSON: primaryButtonMap, secondaryButtonJSON: secondaryButtonMap, delegateObject: delegateObject, additionalData: additionalData)
}
open override func reset() {
super.reset()
secondaryButton?.setAsSecondaryCustom()
}
// MARK: - Constraining
override func setupButton() {
setupWithTwoButtons()

View File

@ -13,6 +13,7 @@
#import "MVMCoreUIObject.h"
#import <MVMCoreUI/MVMCoreUI-Swift.h>
#import "MFTextField.h"
#import "MVMCoreUIViewConstrainingProtocol.h"
@implementation MVMCoreUIMoleculeMappingObject
@ -82,8 +83,11 @@
return nil;
}
UIView <MVMCoreUIMoleculeViewProtocol>*molecule = [self createMoleculeForName:moleculeName];
if (constrainIfNeeded && [molecule respondsToSelector:@selector(needsToBeConstrained)] && [molecule needsToBeConstrained]) {
molecule = [[ViewConstrainingView alloc] initWithMolecule:molecule alignment:[molecule respondsToSelector:@selector(moleculeAlignment)] ? [molecule moleculeAlignment] : UIStackViewAlignmentFill];
// Check if we need to constrain this view.
UIView <MVMCoreUIViewConstrainingProtocol> *castMolecule = [molecule conformsToProtocol:@protocol(MVMCoreUIViewConstrainingProtocol)] ? (UIView <MVMCoreUIViewConstrainingProtocol> *)molecule : nil;
if (constrainIfNeeded && [castMolecule respondsToSelector:@selector(needsToBeConstrained)] && [castMolecule needsToBeConstrained]) {
molecule = [[ViewConstrainingView alloc] initWithMolecule:molecule alignment:[castMolecule respondsToSelector:@selector(alignment)] ? [castMolecule alignment] : UIStackViewAlignmentFill];
}
[molecule setWithJSON:moleculeJSON delegateObject:delegateObject additionalData:nil];
return molecule;

View File

@ -0,0 +1,24 @@
//
// MVMCoreUIViewConstrainingProtocol.h
// MVMCoreUI
//
// Created by Scott Pfeil on 6/3/19.
// Copyright © 2019 Verizon Wireless. All rights reserved.
//
#import <UIKit/UIKit.h>
@protocol MVMCoreUIViewConstrainingProtocol <NSObject>
@optional
/// Notifies the creator that the view may not be suitable to be shown on its own and it needs to be added to a view to help with layout.
- (BOOL)needsToBeConstrained;
/// The alignment if constrained.
- (UIStackViewAlignment)alignment;
/// Can be used to override any standard constraints that may be added.
- (BOOL)useStandardConstraints;
@end

View File

@ -91,6 +91,7 @@ B3 -> Legal
+ (CGFloat)defaultHorizontalPaddingForSize:(CGFloat)size;
+ (CGFloat)defaultVerticalPaddingForSize:(CGFloat)size;
+ (void)setDefaultMarginsForView:(nullable UIView *)view size:(CGFloat)size;
+ (void)setDefaultMarginsForView:(nullable UIView *)view size:(CGFloat)size horizontal:(BOOL)horizontal vertical:(BOOL)vertical;
//-------------------------------------------------
// Returns the fonts for these styles. Scales them as needed by default

View File

@ -91,12 +91,17 @@ CGFloat const LabelWithInternalButtonLineSpace = 2;
}
+ (void)setDefaultMarginsForView:(nullable UIView *)view size:(CGFloat)size {
[self setDefaultMarginsForView:view size:size horizontal:YES vertical:NO];
}
+ (void)setDefaultMarginsForView:(nullable UIView *)view size:(CGFloat)size horizontal:(BOOL)horizontal vertical:(BOOL)vertical {
[MVMCoreDispatchUtility performBlockOnMainThread:^{
CGFloat padding = [MFStyler defaultHorizontalPaddingForSize:size];
CGFloat horizontalPadding = horizontal ? [MFStyler defaultHorizontalPaddingForSize:size] : 0;
CGFloat verticalPadding = vertical ? PaddingDefaultVerticalSpacing : 0;
if (@available(iOS 11.0, *)) {
view.directionalLayoutMargins = NSDirectionalEdgeInsetsMake(0, padding, 0, padding);
view.directionalLayoutMargins = NSDirectionalEdgeInsetsMake(verticalPadding, horizontalPadding, verticalPadding, horizontalPadding);
} else {
view.layoutMargins = UIEdgeInsetsMake(0, padding, 0, padding);
view.layoutMargins = UIEdgeInsetsMake(verticalPadding, horizontalPadding, verticalPadding, horizontalPadding);
}
}];
}

View File

@ -85,6 +85,7 @@ open class MoleculeListTemplate: ThreeLayerTableViewController {
protocolCell.setSeparatorWithJSON?(loadObject?.pageJSON?.optionalDictionaryForKey("separator"), delegateObject: delegate, additionalData: nil, indexPath: indexPath)
}
if let protocolCell = cell as? MVMCoreUIMoleculeViewProtocol {
protocolCell.reset?()
protocolCell.setWithJSON(molecule.molecule, delegateObject: delegate, additionalData: nil)
protocolCell.updateView(tableView.bounds.width)
}