Merge branch 'develop' into feature/label_export_box

This commit is contained in:
Kevin G Christiano 2019-08-14 10:35:52 -04:00
commit 7c93506d87
21 changed files with 294 additions and 39 deletions

View File

@ -18,6 +18,7 @@
01DF55E021F8FAA800CC099B /* MFTextFieldListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01DF55DF21F8FAA800CC099B /* MFTextFieldListView.swift */; }; 01DF55E021F8FAA800CC099B /* MFTextFieldListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01DF55DF21F8FAA800CC099B /* MFTextFieldListView.swift */; };
01DF567021FA5AB300CC099B /* TextFieldListFormViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01DF566F21FA5AB300CC099B /* TextFieldListFormViewController.swift */; }; 01DF567021FA5AB300CC099B /* TextFieldListFormViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01DF566F21FA5AB300CC099B /* TextFieldListFormViewController.swift */; };
01E569D3223FFFA500327251 /* ThreeLayerViewController.swift in Headers */ = {isa = PBXBuildFile; fileRef = D2A5146A2214905000345BFB /* ThreeLayerViewController.swift */; settings = {ATTRIBUTES = (Public, ); }; }; 01E569D3223FFFA500327251 /* ThreeLayerViewController.swift in Headers */ = {isa = PBXBuildFile; fileRef = D2A5146A2214905000345BFB /* ThreeLayerViewController.swift */; settings = {ATTRIBUTES = (Public, ); }; };
0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */; };
B8200E152280C4CF007245F4 /* ProgressBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8200E142280C4CF007245F4 /* ProgressBar.swift */; }; B8200E152280C4CF007245F4 /* ProgressBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8200E142280C4CF007245F4 /* ProgressBar.swift */; };
B8200E192281DC1A007245F4 /* ProgressBarWithLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8200E182281DC1A007245F4 /* ProgressBarWithLabel.swift */; }; B8200E192281DC1A007245F4 /* ProgressBarWithLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8200E182281DC1A007245F4 /* ProgressBarWithLabel.swift */; };
D206997721FB8A0B00CAE0DE /* MVMCoreUINavigationController.h in Headers */ = {isa = PBXBuildFile; fileRef = D206997521FB8A0B00CAE0DE /* MVMCoreUINavigationController.h */; settings = {ATTRIBUTES = (Public, ); }; }; D206997721FB8A0B00CAE0DE /* MVMCoreUINavigationController.h in Headers */ = {isa = PBXBuildFile; fileRef = D206997521FB8A0B00CAE0DE /* MVMCoreUINavigationController.h */; settings = {ATTRIBUTES = (Public, ); }; };
@ -195,6 +196,7 @@
01CA51B4229716F60071A6EE /* Switch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Switch.swift; sourceTree = "<group>"; }; 01CA51B4229716F60071A6EE /* Switch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Switch.swift; sourceTree = "<group>"; };
01DF55DF21F8FAA800CC099B /* MFTextFieldListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MFTextFieldListView.swift; sourceTree = "<group>"; }; 01DF55DF21F8FAA800CC099B /* MFTextFieldListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MFTextFieldListView.swift; sourceTree = "<group>"; };
01DF566F21FA5AB300CC099B /* TextFieldListFormViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextFieldListFormViewController.swift; sourceTree = "<group>"; }; 01DF566F21FA5AB300CC099B /* TextFieldListFormViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextFieldListFormViewController.swift; sourceTree = "<group>"; };
0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionDetailWithImage.swift; sourceTree = "<group>"; };
B8200E142280C4CF007245F4 /* ProgressBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressBar.swift; sourceTree = "<group>"; }; B8200E142280C4CF007245F4 /* ProgressBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressBar.swift; sourceTree = "<group>"; };
B8200E182281DC1A007245F4 /* ProgressBarWithLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressBarWithLabel.swift; sourceTree = "<group>"; }; B8200E182281DC1A007245F4 /* ProgressBarWithLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressBarWithLabel.swift; sourceTree = "<group>"; };
D206997521FB8A0B00CAE0DE /* MVMCoreUINavigationController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUINavigationController.h; sourceTree = "<group>"; }; D206997521FB8A0B00CAE0DE /* MVMCoreUINavigationController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVMCoreUINavigationController.h; sourceTree = "<group>"; };
@ -476,6 +478,7 @@
D29DF10E21E67A77003B2FB9 /* Molecules */ = { D29DF10E21E67A77003B2FB9 /* Molecules */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */,
01DF55DF21F8FAA800CC099B /* MFTextFieldListView.swift */, 01DF55DF21F8FAA800CC099B /* MFTextFieldListView.swift */,
D29770C721F7C4AE00B2F0D0 /* TopLabelsView.h */, D29770C721F7C4AE00B2F0D0 /* TopLabelsView.h */,
D29770C621F7C4AE00B2F0D0 /* TopLabelsView.m */, D29770C621F7C4AE00B2F0D0 /* TopLabelsView.m */,
@ -1011,6 +1014,7 @@
D29DF13221E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.m in Sources */, D29DF13221E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.m in Sources */,
D29DF29C21E7ADB9003B2FB9 /* MFProgrammaticTableViewController.m in Sources */, D29DF29C21E7ADB9003B2FB9 /* MFProgrammaticTableViewController.m in Sources */,
0105618E224BBE7700E1557D /* FormValidator+TextFields.swift in Sources */, 0105618E224BBE7700E1557D /* FormValidator+TextFields.swift in Sources */,
0A1214A022C11A18007C7030 /* ActionDetailWithImage.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

@ -191,6 +191,17 @@ public typealias ActionBlock = () -> ()
setLabel(label, withHTML: json?.optionalStringForKey("html")) setLabel(label, withHTML: json?.optionalStringForKey("html"))
if let alignment = json?.optionalStringForKey("textAlignment") {
switch alignment {
case "center":
label.textAlignment = .center
case "trailing":
label.textAlignment = .right
default:
label.textAlignment = .left
}
}
if let backgroundColorHex = json?.optionalStringForKey(KeyBackgroundColor), !backgroundColorHex.isEmpty { if let backgroundColorHex = json?.optionalStringForKey(KeyBackgroundColor), !backgroundColorHex.isEmpty {
label.backgroundColor = UIColor.mfGet(forHex: backgroundColorHex) label.backgroundColor = UIColor.mfGet(forHex: backgroundColorHex)
} }
@ -442,6 +453,7 @@ extension Label {
public func reset() { public func reset() {
text = nil text = nil
attributedText = nil attributedText = nil
textAlignment = .left
originalAttributedString = nil originalAttributedString = nil
hasAttachmentImageInsideText = false hasAttachmentImageInsideText = false
styleB2(true) styleB2(true)

View File

@ -30,7 +30,6 @@ typedef void (^PerformActionForRadioButton)(void);
@property (nullable, copy, nonatomic) PerformActionForRadioButton performActionForCheck; @property (nullable, copy, nonatomic) PerformActionForRadioButton performActionForCheck;
typedef void (^CircleSelectedClosure)(_Nonnull id sender); typedef void (^CircleSelectedClosure)(_Nonnull id sender);
@property (nonatomic, strong, nullable) UIColor* fillColor; @property (nonatomic, strong, nullable) UIColor* fillColor;
@property (nonatomic, strong, nullable) UIColor* borderColor; @property (nonatomic, strong, nullable) UIColor* borderColor;
@property (nonatomic) CGFloat circleBorderWidth; @property (nonatomic) CGFloat circleBorderWidth;
@ -38,11 +37,16 @@ typedef void (^CircleSelectedClosure)(_Nonnull id sender);
@property (nonatomic, copy, nullable) CircleSelectedClosure handleSelectionBlock; @property (nonatomic, copy, nullable) CircleSelectedClosure handleSelectionBlock;
@property (nonatomic) CGFloat circleDiameter; @property (nonatomic) CGFloat circleDiameter;
@property (nonatomic, nullable, strong, readonly) CAShapeLayer * myCircle; @property (nonatomic, nullable, strong, readonly) CAShapeLayer * myCircle;
@property (nullable, weak, nonatomic) UIView *outerCircleView;
@property (nullable, weak, nonatomic) UIView *innerCircleView;
@property (nonatomic, strong, nullable) NSLayoutConstraint *heightConstraint; @property (nonatomic, strong, nullable) NSLayoutConstraint *heightConstraint;
@property (nonatomic, strong, nullable) NSLayoutConstraint *widthConstraint; @property (nonatomic, strong, nullable) NSLayoutConstraint *widthConstraint;
@property (nonatomic) BOOL respondsToTapGesture; @property (nonatomic) BOOL respondsToTapGesture;
@property (nonatomic, getter = isSelected) BOOL selected; @property (nonatomic, getter = isSelected) BOOL selected;
@property (strong, nonatomic) NSLayoutConstraint *innerHeightConstarint;
@property (strong, nonatomic) NSLayoutConstraint *innerWidthConstarint;
@property (strong, nonatomic) NSLayoutConstraint *outerHeightConstarint;
@property (strong, nonatomic) NSLayoutConstraint *outerWidthConstarint;
// Set line width manually // Set line width manually
- (void)setCheckMarkLineWidth:(CGFloat)lineWidth; - (void)setCheckMarkLineWidth:(CGFloat)lineWidth;

View File

@ -12,11 +12,6 @@
static CGFloat const DefaultOuterCircleSize = 31; static CGFloat const DefaultOuterCircleSize = 31;
static CGFloat const DefaultInnerCircleSize = 19; static CGFloat const DefaultInnerCircleSize = 19;
@interface MFRadioButton ()
@property (nullable, weak, nonatomic) UIView *outerCircleView;
@property (nullable, weak, nonatomic) UIView *innerCircleView;
@end
@implementation MFRadioButton @implementation MFRadioButton
@ -65,8 +60,10 @@ static CGFloat const DefaultInnerCircleSize = 19;
[outerCircleView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor].active = YES; [outerCircleView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor].active = YES;
[outerCircleView.rightAnchor constraintEqualToAnchor:self.rightAnchor].active = YES; [outerCircleView.rightAnchor constraintEqualToAnchor:self.rightAnchor].active = YES;
[outerCircleView.widthAnchor constraintEqualToConstant:DefaultOuterCircleSize].active = YES; self.outerHeightConstarint = [outerCircleView.widthAnchor constraintEqualToConstant:DefaultOuterCircleSize];
[outerCircleView.heightAnchor constraintEqualToConstant:DefaultOuterCircleSize].active = YES; self.outerHeightConstarint.active = YES;
self.outerWidthConstarint = [outerCircleView.heightAnchor constraintEqualToConstant:DefaultOuterCircleSize];
self.outerWidthConstarint.active = YES;
UIView *innerCircleView = [[UIView alloc] init]; UIView *innerCircleView = [[UIView alloc] init];
[outerCircleView addSubview:innerCircleView]; [outerCircleView addSubview:innerCircleView];
@ -76,8 +73,11 @@ static CGFloat const DefaultInnerCircleSize = 19;
[innerCircleView.centerXAnchor constraintEqualToAnchor:outerCircleView.centerXAnchor].active = YES; [innerCircleView.centerXAnchor constraintEqualToAnchor:outerCircleView.centerXAnchor].active = YES;
[innerCircleView.centerYAnchor constraintEqualToAnchor:outerCircleView.centerYAnchor].active = YES; [innerCircleView.centerYAnchor constraintEqualToAnchor:outerCircleView.centerYAnchor].active = YES;
[innerCircleView.widthAnchor constraintEqualToConstant:DefaultInnerCircleSize].active = YES;
[innerCircleView.heightAnchor constraintEqualToConstant:DefaultInnerCircleSize].active = YES; self.innerHeightConstarint = [innerCircleView.heightAnchor constraintEqualToConstant:DefaultInnerCircleSize];
self.innerHeightConstarint.active = YES;
self.innerWidthConstarint = [innerCircleView.widthAnchor constraintEqualToConstant:DefaultInnerCircleSize];
self.innerWidthConstarint.active = YES;
outerCircleView.userInteractionEnabled = NO; outerCircleView.userInteractionEnabled = NO;
innerCircleView.userInteractionEnabled = NO; innerCircleView.userInteractionEnabled = NO;

View File

@ -48,6 +48,9 @@
- (void)setAsMolecule { - (void)setAsMolecule {
self.translatesAutoresizingMaskIntoConstraints = NO; self.translatesAutoresizingMaskIntoConstraints = NO;
if (@available(iOS 11.0, *)) {
self.insetsLayoutMarginsFromSafeArea = NO;
}
} }
- (void)reset { - (void)reset {

View File

@ -336,6 +336,7 @@
} }
- (void)reset { - (void)reset {
[super reset];
self.updateViewHorizontalDefaults = NO; self.updateViewHorizontalDefaults = NO;
self.updateViewVerticalDefaults = NO; self.updateViewVerticalDefaults = NO;
if ([self.molecule respondsToSelector:@selector(alignment)]) { if ([self.molecule respondsToSelector:@selector(alignment)]) {

View File

@ -61,6 +61,9 @@
tableView.separatorStyle = UITableViewCellSeparatorStyleNone; tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
tableView.delegate = self; tableView.delegate = self;
tableView.dataSource = self; tableView.dataSource = self;
if (@available(iOS 11.0, *)) {
tableView.insetsContentViewsToSafeArea = NO;
}
if ([tableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)]) { if ([tableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)]) {
tableView.cellLayoutMarginsFollowReadableWidth = NO; tableView.cellLayoutMarginsFollowReadableWidth = NO;
} }

View File

@ -21,23 +21,21 @@ open class ThreeLayerTableViewController: MFProgrammaticTableViewController {
private var topViewBottomConstraint: NSLayoutConstraint? private var topViewBottomConstraint: NSLayoutConstraint?
private var bottomViewTopConstraint: NSLayoutConstraint? private var bottomViewTopConstraint: NSLayoutConstraint?
//MARK: - MVMCoreViewProtocol //MARK: - MFViewController
open override func updateViews() { open override func updateViews() {
super.updateViews() super.updateViews()
let width = view.bounds.width let width = view.bounds.width
MFStyler.setDefaultMarginsFor(contentView, size: width)
if let topView = topView as? MVMCoreViewProtocol { if let topView = topView as? MVMCoreViewProtocol {
topView.updateView(width) topView.updateView(width)
showHeader() showHeader(width)
} }
if let bottomView = bottomView as? MVMCoreViewProtocol { if let bottomView = bottomView as? MVMCoreViewProtocol {
bottomView.updateView(width) bottomView.updateView(width)
showFooter() showFooter(width)
} }
self.tableView?.reloadData() self.tableView?.reloadData()
} }
//MARK: - MFViewController
open override func newDataBuildScreen() { open override func newDataBuildScreen() {
super.newDataBuildScreen() super.newDataBuildScreen()
createViewForTableHeader() createViewForTableHeader()
@ -103,14 +101,15 @@ open class ThreeLayerTableViewController: MFProgrammaticTableViewController {
currentSpaceForCompare = currentSpace * 2; currentSpaceForCompare = currentSpace * 2;
} }
let width = view.bounds.width
if !MVMCoreGetterUtility.cgfequalwiththreshold(newSpace, currentSpaceForCompare, 0.1) { if !MVMCoreGetterUtility.cgfequalwiththreshold(newSpace, currentSpaceForCompare, 0.1) {
if fillTop && fillBottom { if fillTop && fillBottom {
// space both // space both
let half = newSpace / 2 let half = newSpace / 2
topViewBottomConstraint?.constant = half topViewBottomConstraint?.constant = half
bottomViewTopConstraint?.constant = half bottomViewTopConstraint?.constant = half
showHeader() showHeader(width)
showFooter() showFooter(width)
} else if fillTop { } else if fillTop {
// Only top is spaced (half the size if the bottom view is out of the scroll because it needs to be sized as if there are two spacers but there is only one. // Only top is spaced (half the size if the bottom view is out of the scroll because it needs to be sized as if there are two spacers but there is only one.
if bottomViewOutsideOfScrollArea { if bottomViewOutsideOfScrollArea {
@ -118,11 +117,11 @@ open class ThreeLayerTableViewController: MFProgrammaticTableViewController {
} else { } else {
topViewBottomConstraint?.constant = newSpace topViewBottomConstraint?.constant = newSpace
} }
showHeader() showHeader(width)
} else if fillBottom { } else if fillBottom {
// Only bottom is spaced. // Only bottom is spaced.
bottomViewTopConstraint?.constant = newSpace bottomViewTopConstraint?.constant = newSpace
showFooter() showFooter(width)
} }
} }
} }
@ -141,7 +140,7 @@ open class ThreeLayerTableViewController: MFProgrammaticTableViewController {
topViewBottomConstraint = headerView.bottomAnchor.constraint(equalTo: topView.bottomAnchor, constant: spaceBelowTopView() ?? 0) topViewBottomConstraint = headerView.bottomAnchor.constraint(equalTo: topView.bottomAnchor, constant: spaceBelowTopView() ?? 0)
topViewBottomConstraint?.isActive = true topViewBottomConstraint?.isActive = true
self.headerView = headerView self.headerView = headerView
showHeader() showHeader(nil)
} }
/// Gets the bottom view and adds it to a spacing view, footerView, and then calls showFooter. /// Gets the bottom view and adds it to a spacing view, footerView, and then calls showFooter.
@ -157,11 +156,11 @@ open class ThreeLayerTableViewController: MFProgrammaticTableViewController {
footerView.rightAnchor.constraint(equalTo: bottomView.rightAnchor).isActive = true footerView.rightAnchor.constraint(equalTo: bottomView.rightAnchor).isActive = true
footerView.bottomAnchor.constraint(equalTo: bottomView.bottomAnchor).isActive = true footerView.bottomAnchor.constraint(equalTo: bottomView.bottomAnchor).isActive = true
self.footerView = footerView self.footerView = footerView
showFooter() showFooter(nil)
} }
/// Takes the current headerView and adds it to the tableHeaderView /// Takes the current headerView and adds it to the tableHeaderView
func showHeader() { func showHeader(_ sizingWidth: CGFloat?) {
headerView?.removeFromSuperview() headerView?.removeFromSuperview()
tableView?.tableHeaderView = nil tableView?.tableHeaderView = nil
guard let headerView = headerView else { guard let headerView = headerView else {
@ -177,7 +176,7 @@ open class ThreeLayerTableViewController: MFProgrammaticTableViewController {
} }
/// Takes the current footerView and adds it to the tableFooterView /// Takes the current footerView and adds it to the tableFooterView
func showFooter() { func showFooter(_ sizingWidth: CGFloat?) {
footerView?.removeFromSuperview() footerView?.removeFromSuperview()
safeAreaView?.removeFromSuperview() safeAreaView?.removeFromSuperview()
guard let footerView = footerView, let tableView = tableView else { guard let footerView = footerView, let tableView = tableView else {

View File

@ -303,8 +303,9 @@
} }
- (void)addViewToContentView:(UIView *)bottomView { - (void)addViewToContentView:(UIView *)bottomView {
if (![self bottomViewOutsideOfScroll]) {
self.bottomConstraint.active = YES; self.bottomConstraint.active = YES;
}
// Buttons will be at the bottom of the content view. // Buttons will be at the bottom of the content view.
[self.contentView addSubview:bottomView]; [self.contentView addSubview:bottomView];

View File

@ -0,0 +1,186 @@
//
// ActionDetailWithImage.swift
// MVMCoreUI
//
// Created by Christiano, Kevin on 6/20/19.
// Copyright © 2019 Verizon Wireless. All rights reserved.
//
import UIKit
@objcMembers open class ActionDetailWithImage: ViewConstrainingView {
//------------------------------------------------------
// MARK: - Outlets
//------------------------------------------------------
let title = Label.commonLabelH3(true)
let message = Label.commonLabelB3(true)
let button = PrimaryButton.primaryTinyButton(false)!
let imageLoader = MFLoadImageView(pinnedEdges: .all)
let leftContainer = ViewConstrainingView.empty()
//------------------------------------------------------
// MARK: - Properties
//------------------------------------------------------
var bottomTitlePadding: CGFloat = PaddingOne
//------------------------------------------------------
// MARK: - Constraints
//------------------------------------------------------
var imageLeadingConstraint: NSLayoutConstraint?
var buttonTopConstraint: NSLayoutConstraint?
var messageTopConstraint: NSLayoutConstraint?
//------------------------------------------------------
// MARK: - Initialization
//------------------------------------------------------
public init() {
super.init(frame: .zero)
}
public override init(frame: CGRect) {
super.init(frame: frame)
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
public convenience init(json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
self.init()
setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
}
//------------------------------------------------------
// MARK: - View Lifecycle
//------------------------------------------------------
override open func setupView() {
super.setupView()
guard subviews.isEmpty else { return }
setDefaultState()
addSubview(leftContainer)
addSubview(imageLoader)
leftContainer.addSubview(title)
leftContainer.addSubview(message)
leftContainer.addSubview(button)
leftContainer.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor).isActive = true
leftContainer.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor).isActive = true
layoutMarginsGuide.bottomAnchor.constraint(greaterThanOrEqualTo: leftContainer.bottomAnchor).isActive = true
let leftContainerBottom = leftContainer.bottomAnchor.constraint(equalTo: bottomAnchor)
leftContainerBottom.priority = UILayoutPriority(249)
leftContainerBottom.isActive = true
title.topAnchor.constraint(equalTo: leftContainer.topAnchor).isActive = true
title.leadingAnchor.constraint(equalTo: leftContainer.leadingAnchor).isActive = true
leftContainer.trailingAnchor.constraint(equalTo: title.trailingAnchor).isActive = true
messageTopConstraint = message.topAnchor.constraint(equalTo: title.bottomAnchor, constant: PaddingOne)
messageTopConstraint?.isActive = true
message.leadingAnchor.constraint(equalTo: leftContainer.leadingAnchor).isActive = true
leftContainer.trailingAnchor.constraint(equalTo: message.trailingAnchor).isActive = true
buttonTopConstraint = button.topAnchor.constraint(equalTo: message.bottomAnchor, constant: PaddingTwo)
buttonTopConstraint?.isActive = true
button.leadingAnchor.constraint(equalTo: leftContainer.leadingAnchor).isActive = true
leftContainer.bottomAnchor.constraint(equalTo: button.bottomAnchor).isActive = true
leftContainer.trailingAnchor.constraint(greaterThanOrEqualTo: button.trailingAnchor).isActive = true
imageLoader.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
layoutMarginsGuide.trailingAnchor.constraint(equalTo: imageLoader.trailingAnchor).isActive = true
imageLeadingConstraint = imageLoader.leadingAnchor.constraint(greaterThanOrEqualTo: leftContainer.trailingAnchor, constant: 16)
imageLeadingConstraint?.isActive = true
imageLoader.topAnchor.constraint(greaterThanOrEqualTo: layoutMarginsGuide.topAnchor).isActive = true
layoutMarginsGuide.bottomAnchor.constraint(greaterThanOrEqualTo: imageLoader.bottomAnchor).isActive = true
let imageloaderBottom = imageLoader.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor)
imageloaderBottom.priority = UILayoutPriority(249)
imageloaderBottom.isActive = true
}
override open func updateView(_ size: CGFloat) {
super.updateView(size)
title.updateView(size)
message.updateView(size)
button.updateView(size)
imageLoader.updateView(size)
leftContainer.updateView(size)
messageTopConstraint?.constant = title.hasText && message.hasText ? bottomTitlePadding : 0
buttonTopConstraint?.constant = message.hasText || title.hasText ? PaddingTwo : 0
}
public override static func estimatedHeight(forRow json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat {
return 197
}
//------------------------------------------------------
// MARK: - Methods
//------------------------------------------------------
private func setDefaultState() {
title.font = MFStyler.fontH3()
message.font = MFStyler.fontB3()
button.setAsSecondaryCustom()
button.isHidden = false
imageLoader.imageView.contentMode = .scaleAspectFit
imageLoader.addSizeConstraintsForAspectRatio = true
bottomTitlePadding = PaddingOne
}
override open func reset() {
super.reset()
title.reset()
message.reset()
button.reset()
imageLeadingConstraint?.constant = 16
imageLoader.reset()
setDefaultState()
}
open override func setAsMolecule() {
super.setAsMolecule()
title.setAsMolecule()
message.setAsMolecule()
button.setAsMolecule()
imageLoader.setAsMolecule()
setDefaultState()
}
open override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
guard let dictionary = json else { return }
if let padding = dictionary.optionalCGFloatForKey("bottomTitlePadding") {
bottomTitlePadding = padding
}
title.setWithJSON(dictionary.optionalDictionaryForKey("title"), delegateObject: delegateObject, additionalData: additionalData)
message.setWithJSON(dictionary.optionalDictionaryForKey("message"), delegateObject: delegateObject, additionalData: additionalData)
imageLoader.setWithJSON(dictionary.optionalDictionaryForKey("image"), delegateObject: delegateObject, additionalData: additionalData)
if let buttonDictionary = dictionary.optionalDictionaryForKey("button") {
button.setWithJSON(buttonDictionary, delegateObject: delegateObject, additionalData: additionalData)
} else {
button.isHidden = true
}
}
}

View File

@ -37,6 +37,11 @@ open class MoleculeCollectionViewCell: UICollectionViewCell, MVMCoreUIMoleculeVi
} }
isAccessibilityElement = false isAccessibilityElement = false
contentView.isAccessibilityElement = false contentView.isAccessibilityElement = false
if #available(iOS 11.0, *) {
insetsLayoutMarginsFromSafeArea = false
contentView.insetsLayoutMarginsFromSafeArea = false
contentView.preservesSuperviewLayoutMargins = false
}
// Covers the card when peaking. // Covers the card when peaking.
peakingCover.backgroundColor = .white peakingCover.backgroundColor = .white

View File

@ -80,6 +80,11 @@ import UIKit
public func setupView() { public func setupView() {
selectionStyle = .none selectionStyle = .none
if #available(iOS 11.0, *) {
insetsLayoutMarginsFromSafeArea = false
contentView.insetsLayoutMarginsFromSafeArea = false
contentView.preservesSuperviewLayoutMargins = false
}
} }
// MARK: - MVMCoreUIMoleculeViewProtocol // MARK: - MVMCoreUIMoleculeViewProtocol

View File

@ -46,8 +46,9 @@
@"listItem": MoleculeTableViewCell.class, @"listItem": MoleculeTableViewCell.class,
@"switchLineItem": SwitchLineItem.class, @"switchLineItem": SwitchLineItem.class,
@"switch": Switch.class, @"switch": Switch.class,
@"image": MFLoadImageView.class,
@"leftRightLabelView": LeftRightLabelView.class, @"leftRightLabelView": LeftRightLabelView.class,
@"actionDetailWithImage": ActionDetailWithImage.class,
@"image": MFLoadImageView.class,
@"moduleMolecule": ModuleMolecule.class, @"moduleMolecule": ModuleMolecule.class,
@"headlineBody": HeadlineBody.class, @"headlineBody": HeadlineBody.class,
@"carousel": Carousel.class, @"carousel": Carousel.class,

View File

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "closeXBlack.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "closeXBlack@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "closeXBlack@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 535 B

View File

@ -8,7 +8,7 @@
import UIKit import UIKit
public class MoleculeStackTemplate: ThreeLayerViewController { open class MoleculeStackTemplate: ThreeLayerViewController {
var observer: NSKeyValueObservation? var observer: NSKeyValueObservation?
open override var loadObject: MVMCoreLoadObject? { open override var loadObject: MVMCoreLoadObject? {
@ -25,18 +25,18 @@ public class MoleculeStackTemplate: ThreeLayerViewController {
} }
} }
public override func spaceBetweenTopAndMiddle() -> CGFloat? { open override func spaceBetweenTopAndMiddle() -> CGFloat? {
return 0 return 0
} }
public override func viewForTop() -> UIView? { open override func viewForTop() -> UIView? {
guard let moleculeJSON = loadObject?.pageJSON?.optionalDictionaryForKey("header"), let molecule = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(forJSON: moleculeJSON, delegateObject: delegateObject() as? MVMCoreUIDelegateObject, constrainIfNeeded: true) else { guard let moleculeJSON = loadObject?.pageJSON?.optionalDictionaryForKey("header"), let molecule = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(forJSON: moleculeJSON, delegateObject: delegateObject() as? MVMCoreUIDelegateObject, constrainIfNeeded: true) else {
return nil return nil
} }
return molecule return molecule
} }
public override func viewForMiddle() -> UIView? { open override func viewForMiddle() -> UIView? {
guard let moleculeJSON = loadObject?.pageJSON?.optionalDictionaryForKey("moleculeStack") else { guard let moleculeJSON = loadObject?.pageJSON?.optionalDictionaryForKey("moleculeStack") else {
return nil return nil
} }
@ -46,7 +46,7 @@ public class MoleculeStackTemplate: ThreeLayerViewController {
return stack return stack
} }
override public func viewForBottom() -> UIView? { override open func viewForBottom() -> UIView? {
guard let moleculeJSON = loadObject?.pageJSON?.optionalDictionaryForKey("footer"), let molecule = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(forJSON: moleculeJSON, delegateObject: delegateObject() as? MVMCoreUIDelegateObject, constrainIfNeeded: true) else { guard let moleculeJSON = loadObject?.pageJSON?.optionalDictionaryForKey("footer"), let molecule = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(forJSON: moleculeJSON, delegateObject: delegateObject() as? MVMCoreUIDelegateObject, constrainIfNeeded: true) else {
return nil return nil
} }
@ -54,14 +54,14 @@ public class MoleculeStackTemplate: ThreeLayerViewController {
} }
// MARK: - cache handling // MARK: - cache handling
public override func pageTypesToListenFor() -> [Any]? { open override func pageTypesToListenFor() -> [Any]? {
guard let pageType = self.pageType else { guard let pageType = self.pageType else {
return super.pageTypesToListenFor() return super.pageTypesToListenFor()
} }
return [pageType] return [pageType]
} }
public override func modulesToListenFor() -> [Any]? { open override func modulesToListenFor() -> [Any]? {
return loadObject?.requestParameters?.modules return loadObject?.requestParameters?.modules
} }

View File

@ -181,7 +181,7 @@ static const CGFloat VertialShadowOffset = 6;
+ (nonnull MFCustomButton *)addCloseButtonToView:(UIView *)view action:(ButtonTapBlock)actionBlock verticalCentered:(BOOL)verticalCentered { + (nonnull MFCustomButton *)addCloseButtonToView:(UIView *)view action:(ButtonTapBlock)actionBlock verticalCentered:(BOOL)verticalCentered {
MFCustomButton *button = [[MFCustomButton alloc] initWithFrame:CGRectZero]; MFCustomButton *button = [[MFCustomButton alloc] initWithFrame:CGRectZero];
button.translatesAutoresizingMaskIntoConstraints = NO; button.translatesAutoresizingMaskIntoConstraints = NO;
[button setTitle:@"✕" forState:UIControlStateNormal]; [button setImage:[MVMCoreUIUtility imageNamed:@"closeXBlack"] forState:UIControlStateNormal];
button.titleLabel.font = [MFStyler fontForHeadlineAlternative]; button.titleLabel.font = [MFStyler fontForHeadlineAlternative];
//accessibility //accessibility

View File

@ -71,8 +71,9 @@ NS_ASSUME_NONNULL_BEGIN
// Gets the constraint height to be whatever space is left in the scroll view. // Gets the constraint height to be whatever space is left in the scroll view.
+ (CGFloat)getVariableConstraintHeight:(CGFloat)currentConstant inScrollView:(nonnull UIScrollView *)scrollView minimumHeight:(CGFloat)minimumHeight; + (CGFloat)getVariableConstraintHeight:(CGFloat)currentConstant inScrollView:(nonnull UIScrollView *)scrollView minimumHeight:(CGFloat)minimumHeight;
// Sets the view's frame according to constraint. /// Sets the view's frame according to constraints.
+ (void)sizeViewToFit:(nullable UIView *)view; + (void)sizeViewToFit:(nullable UIView *)view;
+ (void)sizeViewToFit:(UIView *)view forWidth:(nullable NSNumber *)width;
#pragma mark - Keyboard #pragma mark - Keyboard

View File

@ -119,7 +119,7 @@
#pragma mark - Sizing #pragma mark - Sizing
+ (CGFloat)getWidth { + (CGFloat)getWidth {
UIViewController *controller = [MVMCoreUISession sharedGlobal].splitViewController ?: [MVMCoreUISession sharedGlobal].navigationController ?: [UIApplication sharedApplication].keyWindow.rootViewController; UIViewController *controller = [MVMCoreUISession sharedGlobal].splitViewController ?: [MVMCoreUISession sharedGlobal].navigationController;
if (controller) { if (controller) {
return CGRectGetWidth(controller.view.bounds); return CGRectGetWidth(controller.view.bounds);
} else { } else {
@ -138,7 +138,7 @@
} }
+ (CGFloat)getHeightOfView:(nonnull UIView *)view forWidth:(nullable NSNumber *)width { + (CGFloat)getHeightOfView:(nonnull UIView *)view forWidth:(nullable NSNumber *)width {
CGFloat floatWidth = (width ? width.floatValue : CGRectGetWidth([MVMCoreNavigationHandler sharedNavigationHandler].navigationController.view.bounds)); CGFloat floatWidth = (width ? width.floatValue : [MVMCoreUIUtility getWidth]);
return [view systemLayoutSizeFittingSize:CGSizeMake(floatWidth, UILayoutFittingCompressedSize.height) withHorizontalFittingPriority:1000 verticalFittingPriority:250].height; return [view systemLayoutSizeFittingSize:CGSizeMake(floatWidth, UILayoutFittingCompressedSize.height) withHorizontalFittingPriority:1000 verticalFittingPriority:250].height;
} }
@ -192,6 +192,13 @@
view.frame = frame; view.frame = frame;
} }
+ (void)sizeViewToFit:(UIView *)view forWidth:(nullable NSNumber *)width {
CGFloat height = [MVMCoreUIUtility getHeightOfView:view forWidth:width];
CGRect frame = view.frame;
frame.size.height = height;
view.frame = frame;
}
#pragma mark - Keyboard #pragma mark - Keyboard
+ (void)setScrollViewInsetForKeyboardShow:(nonnull NSNotification *)notification scrollView:(nonnull UIScrollView *)scrollView viewController:(nonnull UIViewController *)viewController rectToScrollTo:(nonnull CGRect (^)(void))rectToScrollTo { + (void)setScrollViewInsetForKeyboardShow:(nonnull NSNotification *)notification scrollView:(nonnull UIScrollView *)scrollView viewController:(nonnull UIViewController *)viewController rectToScrollTo:(nonnull CGRect (^)(void))rectToScrollTo {