Merge branch 'develop' into feature/kevin
This commit is contained in:
commit
3a8b6890fa
@ -10,7 +10,7 @@
|
|||||||
import MVMCore
|
import MVMCore
|
||||||
|
|
||||||
public typealias ActionBlock = () -> Void
|
public typealias ActionBlock = () -> Void
|
||||||
private typealias ActionIndiciesTuple = (startIndex: String.Index?, endIndex: String.Index?, revisedText: String?)
|
private typealias ActionableStringTuple = (front: String?, middle: String?, end: String?)
|
||||||
public typealias ActionObjectDelegate = (NSObjectProtocol & MVMCoreActionDelegateProtocol)
|
public typealias ActionObjectDelegate = (NSObjectProtocol & MVMCoreActionDelegateProtocol)
|
||||||
public typealias ButtonObjectDelegate = (NSObjectProtocol & ButtonDelegateProtocol)
|
public typealias ButtonObjectDelegate = (NSObjectProtocol & ButtonDelegateProtocol)
|
||||||
public typealias CoreObjectActionLoadPresentDelegate = MVMCoreActionDelegateProtocol & MVMCoreLoadDelegateProtocol & MVMCorePresentationDelegateProtocol & NSObjectProtocol
|
public typealias CoreObjectActionLoadPresentDelegate = MVMCoreActionDelegateProtocol & MVMCoreLoadDelegateProtocol & MVMCorePresentationDelegateProtocol & NSObjectProtocol
|
||||||
@ -381,37 +381,40 @@ public typealias CoreObjectActionLoadPresentDelegate = MVMCoreActionDelegateProt
|
|||||||
|
|
||||||
private func setText(_ text: String?, startTag: String?, endTag: String?) {
|
private func setText(_ text: String?, startTag: String?, endTag: String?) {
|
||||||
|
|
||||||
let actionRange: ActionIndiciesTuple = rangeOfText(text, startTag: startTag, endTag: endTag)
|
let actionableTuple: ActionableStringTuple = rangeOfText(text, startTag: startTag, endTag: endTag)
|
||||||
|
|
||||||
if let revisedText = actionRange.revisedText, let startBraceIndex = actionRange.startIndex, let endBraceIndex = actionRange.endIndex {
|
if let front = actionableTuple.front, let middle = actionableTuple.middle, let end = actionableTuple.end {
|
||||||
|
frontText = front.trimmingCharacters(in: .whitespaces)
|
||||||
frontText = String(revisedText[revisedText.startIndex..<startBraceIndex]).trimmingCharacters(in: .whitespaces)
|
actionText = middle.trimmingCharacters(in: .whitespaces)
|
||||||
actionText = String(revisedText[startBraceIndex..<endBraceIndex]).trimmingCharacters(in: .whitespaces)
|
backText = end.trimmingCharacters(in: .whitespaces)
|
||||||
backText = String(revisedText[endBraceIndex...]).trimmingCharacters(in: .whitespaces)
|
|
||||||
self.text = getTextFromStringComponents()
|
self.text = getTextFromStringComponents()
|
||||||
} else {
|
} else {
|
||||||
frontText = actionRange.revisedText
|
frontText = text
|
||||||
self.text = actionRange.revisedText
|
self.text = text
|
||||||
}
|
}
|
||||||
|
|
||||||
setup()
|
setup()
|
||||||
}
|
}
|
||||||
|
|
||||||
private func rangeOfText(_ text: String?, startTag: String?, endTag: String?) -> ActionIndiciesTuple {
|
private func rangeOfText(_ text: String?, startTag: String?, endTag: String?) -> ActionableStringTuple {
|
||||||
|
|
||||||
var fullText = text ?? ""
|
var actionableTuple: ActionableStringTuple = (front: nil, middle: nil, end: nil)
|
||||||
var actionRange: ActionIndiciesTuple = (startIndex: nil, endIndex: nil, revisedText: nil)
|
|
||||||
|
|
||||||
if let leftBrace = startTag, let rightBrace = endTag, fullText.contains(Character(leftBrace)) && fullText.contains(Character(rightBrace)) {
|
guard let text = text else { return actionableTuple }
|
||||||
actionRange.startIndex = fullText.firstIndex(of: Character(leftBrace))
|
|
||||||
fullText = fullText.replacingOccurrences(of: leftBrace, with: "")
|
|
||||||
|
|
||||||
actionRange.endIndex = fullText.firstIndex(of: Character(rightBrace))
|
if let leftTag = startTag, text.contains(leftTag) {
|
||||||
fullText = fullText.replacingOccurrences(of: rightBrace, with: "")
|
|
||||||
|
let firstHalf = text.components(separatedBy: leftTag)
|
||||||
|
actionableTuple.front = firstHalf.first
|
||||||
|
|
||||||
|
if let rightTag = endTag, text.contains(rightTag) {
|
||||||
|
let secondHalf = firstHalf[1].components(separatedBy: rightTag)
|
||||||
|
actionableTuple.middle = secondHalf[0]
|
||||||
|
actionableTuple.end = secondHalf[1]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
actionRange.revisedText = fullText
|
return actionableTuple
|
||||||
return actionRange
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc public func setActionMap(_ actionMap: [AnyHashable: Any]?, additionalData: [AnyHashable: Any]?, actionDelegate delegate: ActionObjectDelegate?) {
|
@objc public func setActionMap(_ actionMap: [AnyHashable: Any]?, additionalData: [AnyHashable: Any]?, actionDelegate delegate: ActionObjectDelegate?) {
|
||||||
|
|||||||
@ -138,7 +138,6 @@
|
|||||||
#pragma mark - MVMCoreUIMoleculeViewProtocol
|
#pragma mark - MVMCoreUIMoleculeViewProtocol
|
||||||
|
|
||||||
- (void)setAsMolecule {
|
- (void)setAsMolecule {
|
||||||
self.updateViewHorizontalDefaults = YES;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -29,13 +29,15 @@
|
|||||||
// Returns the standard space around ui objects.
|
// Returns the standard space around ui objects.
|
||||||
+ (UIEdgeInsets)standardSpaceAroundUIObjectForSize:(CGFloat)size;
|
+ (UIEdgeInsets)standardSpaceAroundUIObjectForSize:(CGFloat)size;
|
||||||
|
|
||||||
// Consolidates generateFormViewWithUIArray and spaceArroundUIObject into one class object so other view controllers can take advantage of these functions.
|
// Consolidates generateFormViewWithUIArray and spaceArroundUIObject into one class object so other view controllers can take advantage of these functions. By default does not pin to margins.
|
||||||
+ (void)populateView:(nonnull UIView *)view withUIArray:(nonnull NSArray <UIView *>*)formUIArray withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock;
|
+ (void)populateView:(nonnull UIView *)view withUIArray:(nonnull NSArray <UIView *>*)formUIArray withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock;
|
||||||
|
+ (void)populateView:(nonnull UIView *)view withUIArray:(nonnull NSArray <UIView *>*)formUIArray useMargins:(BOOL)useMargins withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock;
|
||||||
+ (void)populateViewHorizontally:(nonnull UIView *)view withUIArray:(nonnull NSArray <UIView *>*)formUIArray withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock;
|
+ (void)populateViewHorizontally:(nonnull UIView *)view withUIArray:(nonnull NSArray <UIView *>*)formUIArray withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock;
|
||||||
+ (void)populateView:(nonnull UIView *)view withUIArrayForConstrainingViews:(nonnull NSArray <UIView *>*)formUIArray withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock;
|
+ (void)populateView:(nonnull UIView *)view withUIArrayForConstrainingViews:(nonnull NSArray <UIView *>*)formUIArray withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock;
|
||||||
|
|
||||||
// Does the actual laying out. The formuiarray views should already be added to the view.
|
// Does the actual laying out. The formuiarray views should already be added to the view. By default does not pin to margins
|
||||||
+ (void)autoLayoutView:(nonnull UIView *)view withUIArray:(nonnull NSArray <UIView *>*)formUIArray withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock;
|
+ (void)autoLayoutView:(nonnull UIView *)view withUIArray:(nonnull NSArray <UIView *>*)formUIArray withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock;
|
||||||
|
+ (void)autoLayoutView:(nonnull UIView *)view withUIArray:(nonnull NSArray <UIView *>*)formUIArray useMargins:(BOOL)useMargins withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock;
|
||||||
+ (void)autoLayoutViewHorizontally:(nonnull UIView *)view withUIArray:(nonnull NSArray <UIView *>*)formUIArray withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock;
|
+ (void)autoLayoutViewHorizontally:(nonnull UIView *)view withUIArray:(nonnull NSArray <UIView *>*)formUIArray withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock;
|
||||||
+ (void)autoLayoutViewWithConstrainingViewsWithUIArray:(nonnull NSArray <UIView *>*)formUIArray withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock;
|
+ (void)autoLayoutViewWithConstrainingViewsWithUIArray:(nonnull NSArray <UIView *>*)formUIArray withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock;
|
||||||
|
|
||||||
|
|||||||
@ -10,6 +10,7 @@
|
|||||||
#import "MFStyler.h"
|
#import "MFStyler.h"
|
||||||
#import "ViewConstrainingView.h"
|
#import "ViewConstrainingView.h"
|
||||||
#import "MVMCoreUIUtility.h"
|
#import "MVMCoreUIUtility.h"
|
||||||
|
#import "NSLayoutConstraint+MFConvenience.h"
|
||||||
@interface MVMCoreUIStackableViewController ()
|
@interface MVMCoreUIStackableViewController ()
|
||||||
|
|
||||||
@end
|
@end
|
||||||
@ -69,11 +70,15 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
+ (void)populateView:(nonnull UIView *)view withUIArray:(nonnull NSArray <UIView *>*)formUIArray withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock {
|
+ (void)populateView:(nonnull UIView *)view withUIArray:(nonnull NSArray <UIView *>*)formUIArray withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock {
|
||||||
|
[self populateView:view withUIArray:formUIArray useMargins:NO withSpacingBlock:spacingBlock];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void)populateView:(nonnull UIView *)view withUIArray:(nonnull NSArray <UIView *>*)formUIArray useMargins:(BOOL)useMargins withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock {
|
||||||
if ([formUIArray count] > 0) {
|
if ([formUIArray count] > 0) {
|
||||||
for (UIView *subview in formUIArray) {
|
for (UIView *subview in formUIArray) {
|
||||||
[view addSubview:subview];
|
[view addSubview:subview];
|
||||||
}
|
}
|
||||||
[MVMCoreUIStackableViewController autoLayoutView:view withUIArray:formUIArray withSpacingBlock:spacingBlock];
|
[MVMCoreUIStackableViewController autoLayoutView:view withUIArray:formUIArray useMargins:useMargins withSpacingBlock:spacingBlock];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,34 +101,46 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (void)autoLayoutView:(nonnull UIView *)view withUIArray:(nonnull NSArray <UIView *>*)formUIArray withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock {
|
+ (void)autoLayoutView:(nonnull UIView *)view withUIArray:(nonnull NSArray <UIView *>*)formUIArray useMargins:(BOOL)useMargins withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock {
|
||||||
if ([formUIArray count] > 0) {
|
if ([formUIArray count] > 0) {
|
||||||
|
|
||||||
// Adds the first object to the view and pins it to the top of the content view.
|
// Adds the first object to the view and pins it to the top of the content view.
|
||||||
id previousUIObject = [formUIArray objectAtIndex:0];
|
UIView *previousUIObject = [formUIArray objectAtIndex:0];
|
||||||
UIEdgeInsets spaceAroundObjectPrevious = spacingBlock(previousUIObject);
|
|
||||||
[previousUIObject setTranslatesAutoresizingMaskIntoConstraints:NO];
|
[previousUIObject setTranslatesAutoresizingMaskIntoConstraints:NO];
|
||||||
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-top@999-[previousUIObject]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:@{@"top":@(spaceAroundObjectPrevious.top)} views:NSDictionaryOfVariableBindings(previousUIObject)]];
|
UIEdgeInsets spaceAroundObjectPrevious = spacingBlock(previousUIObject);
|
||||||
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-left@999-[previousUIObject]-right-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:@{@"left":@(spaceAroundObjectPrevious.left),@"right":@(spaceAroundObjectPrevious.right)} views:NSDictionaryOfVariableBindings(previousUIObject)]];
|
NSLayoutConstraint *constraint = [NSLayoutConstraint pinViewTopToSuperview:previousUIObject useMargins:useMargins constant:spaceAroundObjectPrevious.top];
|
||||||
|
constraint.priority = 999;
|
||||||
|
constraint.active = YES;
|
||||||
|
constraint = [NSLayoutConstraint pinViewLeftToSuperview:previousUIObject useMargins:useMargins constant:spaceAroundObjectPrevious.left];
|
||||||
|
constraint.priority = 999;
|
||||||
|
constraint.active = YES;
|
||||||
|
[NSLayoutConstraint pinViewRightToSuperview:previousUIObject useMargins:useMargins constant:spaceAroundObjectPrevious.right].active = YES;
|
||||||
|
|
||||||
// Sets the horizontal spacing and adds vertical spacing between all ui objects.
|
// Sets the horizontal spacing and adds vertical spacing between all ui objects.
|
||||||
for (NSUInteger i = 1; i < [formUIArray count]; i++) {
|
for (NSUInteger i = 1; i < [formUIArray count]; i++) {
|
||||||
|
|
||||||
id uiObject = [formUIArray objectAtIndex:i];
|
UIView *uiObject = [formUIArray objectAtIndex:i];
|
||||||
UIEdgeInsets spaceAroundObjectCurrent = spacingBlock(uiObject);
|
UIEdgeInsets spaceAroundObjectCurrent = spacingBlock(uiObject);
|
||||||
[uiObject setTranslatesAutoresizingMaskIntoConstraints:NO];
|
[uiObject setTranslatesAutoresizingMaskIntoConstraints:NO];
|
||||||
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[previousUIObject]-space-[uiObject]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:@{@"space":@(spaceAroundObjectPrevious.bottom + spaceAroundObjectCurrent.top)} views:NSDictionaryOfVariableBindings(previousUIObject,uiObject)]];
|
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[previousUIObject]-space-[uiObject]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:@{@"space":@(spaceAroundObjectPrevious.bottom + spaceAroundObjectCurrent.top)} views:NSDictionaryOfVariableBindings(previousUIObject,uiObject)]];
|
||||||
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-left@999-[uiObject]-right-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:@{@"left":@(spaceAroundObjectCurrent.left),@"right":@(spaceAroundObjectCurrent.right)} views:NSDictionaryOfVariableBindings(uiObject)]];
|
constraint = [NSLayoutConstraint pinViewLeftToSuperview:uiObject useMargins:useMargins constant:spaceAroundObjectCurrent.left];
|
||||||
|
constraint.priority = 999;
|
||||||
|
constraint.active = YES;
|
||||||
|
[NSLayoutConstraint pinViewRightToSuperview:uiObject useMargins:useMargins constant:spaceAroundObjectCurrent.right].active = YES;
|
||||||
|
|
||||||
previousUIObject = uiObject;
|
previousUIObject = uiObject;
|
||||||
spaceAroundObjectPrevious = spaceAroundObjectCurrent;
|
spaceAroundObjectPrevious = spaceAroundObjectCurrent;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pins the last object to the bottom of the content view.
|
// Pins the last object to the bottom of the content view.
|
||||||
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[previousUIObject]-bottom-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:@{@"bottom":@(spaceAroundObjectPrevious.bottom)} views:NSDictionaryOfVariableBindings(previousUIObject)]];
|
[NSLayoutConstraint pinViewBottomToSuperview:previousUIObject useMargins:useMargins constant:spaceAroundObjectPrevious.bottom].active = YES;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (void)autoLayoutView:(nonnull UIView *)view withUIArray:(nonnull NSArray <UIView *>*)formUIArray withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock {
|
||||||
|
[self autoLayoutView:view withUIArray:formUIArray useMargins:NO withSpacingBlock:spacingBlock];
|
||||||
|
}
|
||||||
|
|
||||||
+ (void)autoLayoutViewHorizontally:(nonnull UIView *)view withUIArray:(nonnull NSArray <UIView *>*)formUIArray withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock {
|
+ (void)autoLayoutViewHorizontally:(nonnull UIView *)view withUIArray:(nonnull NSArray <UIView *>*)formUIArray withSpacingBlock:(nonnull UIEdgeInsets (^) (id _Nullable object))spacingBlock {
|
||||||
if ([formUIArray count] > 0) {
|
if ([formUIArray count] > 0) {
|
||||||
|
|
||||||
|
|||||||
@ -16,6 +16,7 @@ open class ThreeLayerViewController: ProgrammaticScrollViewController {
|
|||||||
var topView: UIView?
|
var topView: UIView?
|
||||||
var middleView: UIView?
|
var middleView: UIView?
|
||||||
var bottomView: UIView?
|
var bottomView: UIView?
|
||||||
|
var useMargins: Bool = true
|
||||||
|
|
||||||
// The bottom view can be put outside of the scrolling area.
|
// The bottom view can be put outside of the scrolling area.
|
||||||
var bottomViewOutsideOfScroll = false
|
var bottomViewOutsideOfScroll = false
|
||||||
@ -26,6 +27,7 @@ open class ThreeLayerViewController: ProgrammaticScrollViewController {
|
|||||||
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)
|
||||||
}
|
}
|
||||||
@ -116,9 +118,9 @@ extension ThreeLayerViewController {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
contentView.addSubview(topView)
|
contentView.addSubview(topView)
|
||||||
topView.leftAnchor.constraint(equalTo: contentView.leftAnchor).isActive = true
|
NSLayoutConstraint.pinViewTop(toSuperview: topView, useMargins: useMargins, constant: 0).isActive = true
|
||||||
contentView.rightAnchor.constraint(equalTo: topView.rightAnchor).isActive = true
|
NSLayoutConstraint.pinViewLeft(toSuperview: topView, useMargins: useMargins, constant: 0).isActive = true
|
||||||
topView.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
|
NSLayoutConstraint.pinViewRight(toSuperview: topView, useMargins: useMargins, constant: 0).isActive = true
|
||||||
return topView
|
return topView
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,8 +135,8 @@ extension ThreeLayerViewController {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
contentView.addSubview(middleView)
|
contentView.addSubview(middleView)
|
||||||
middleView.leftAnchor.constraint(equalTo: contentView.leftAnchor).isActive = true
|
NSLayoutConstraint.pinViewLeft(toSuperview: middleView, useMargins: useMargins, constant: 0).isActive = true
|
||||||
contentView.rightAnchor.constraint(equalTo: middleView.rightAnchor).isActive = true
|
NSLayoutConstraint.pinViewRight(toSuperview: middleView, useMargins: useMargins, constant: 0).isActive = true
|
||||||
middleView.setContentHuggingPriority(UILayoutPriority.required, for: NSLayoutConstraint.Axis.vertical)
|
middleView.setContentHuggingPriority(UILayoutPriority.required, for: NSLayoutConstraint.Axis.vertical)
|
||||||
return middleView
|
return middleView
|
||||||
}
|
}
|
||||||
@ -220,17 +222,17 @@ extension ThreeLayerViewController {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
contentView.addSubview(view);
|
contentView.addSubview(view);
|
||||||
contentView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
|
NSLayoutConstraint.pinViewLeft(toSuperview: view, useMargins: useMargins, constant: 0).isActive = true
|
||||||
contentView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
|
NSLayoutConstraint.pinViewRight(toSuperview: view, useMargins: useMargins, constant: 0).isActive = true
|
||||||
view.leftAnchor.constraint(equalTo: contentView.leftAnchor).isActive = true
|
NSLayoutConstraint.pinViewBottom(toSuperview: view, useMargins: useMargins, constant: 0).isActive = true
|
||||||
}
|
}
|
||||||
|
|
||||||
func addViewOutsideOfScrollViewBottom(_ view: UIView) {
|
func addViewOutsideOfScrollViewBottom(_ view: UIView) {
|
||||||
self.view?.addSubview(view)
|
self.view?.addSubview(view)
|
||||||
if let scrollView = scrollView, let parentView = self.view {
|
if let scrollView = scrollView, let parentView = self.view {
|
||||||
view.topAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
|
view.topAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
|
||||||
view.leftAnchor.constraint(equalTo: parentView.leftAnchor).isActive = true
|
NSLayoutConstraint.pinViewLeft(toSuperview: view, useMargins: useMargins, constant: 0).isActive = true
|
||||||
parentView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
|
NSLayoutConstraint.pinViewRight(toSuperview: view, useMargins: useMargins, constant: 0).isActive = true
|
||||||
if #available(iOS 11.0, *) {
|
if #available(iOS 11.0, *) {
|
||||||
parentView.safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
|
parentView.safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
|
||||||
if let safeAreaView = MVMCoreUICommonViewsUtility.getAndSetupSafeAreaView(on: parentView) {
|
if let safeAreaView = MVMCoreUICommonViewsUtility.getAndSetupSafeAreaView(on: parentView) {
|
||||||
@ -238,7 +240,7 @@ extension ThreeLayerViewController {
|
|||||||
self.safeAreaView = safeAreaView
|
self.safeAreaView = safeAreaView
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
parentView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
|
NSLayoutConstraint.pinViewBottom(toSuperview: view, useMargins: useMargins, constant: 0).isActive = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -55,6 +55,13 @@ extern NSString * _Nonnull const ConstraintWidth;
|
|||||||
|
|
||||||
+(nullable NSDictionary *)constraintAlignView :(nonnull UIView *)firstView toSecondView :(nonnull UIView *)secondView alignX :(BOOL)alignX alignY :(BOOL)alignY;
|
+(nullable NSDictionary *)constraintAlignView :(nonnull UIView *)firstView toSecondView :(nonnull UIView *)secondView alignX :(BOOL)alignX alignY :(BOOL)alignY;
|
||||||
|
|
||||||
|
#pragma mark - With Margins
|
||||||
|
|
||||||
|
+ (nonnull NSLayoutConstraint *)pinViewTopToSuperview:(nonnull UIView *)view useMargins:(BOOL)useMargins constant:(CGFloat)constant;
|
||||||
|
+ (nonnull NSLayoutConstraint *)pinViewLeftToSuperview:(nonnull UIView *)view useMargins:(BOOL)useMargins constant:(CGFloat)constant;
|
||||||
|
+ (nonnull NSLayoutConstraint *)pinViewRightToSuperview:(nonnull UIView *)view useMargins:(BOOL)useMargins constant:(CGFloat)constant;
|
||||||
|
+ (nonnull NSLayoutConstraint *)pinViewBottomToSuperview:(nonnull UIView *)view useMargins:(BOOL)useMargins constant:(CGFloat)constant;
|
||||||
|
|
||||||
#pragma mark - Scaling constraints
|
#pragma mark - Scaling constraints
|
||||||
|
|
||||||
// These functions will pin a view to its super view with space that is a ratio of the anchor (by default the super view's width if nothing is passed in). (So if the space is 24 and the super's width is 320 in the design, then the ratio should be 24/320 and this will be multiplied by the super's current width, so that the constraint always linearly scales).
|
// These functions will pin a view to its super view with space that is a ratio of the anchor (by default the super view's width if nothing is passed in). (So if the space is 24 and the super's width is 320 in the design, then the ratio should be 24/320 and this will be multiplied by the super's current width, so that the constraint always linearly scales).
|
||||||
|
|||||||
@ -150,6 +150,24 @@ NSString *const ConstraintWidth = @"width";
|
|||||||
return constraintsDictionary;
|
return constraintsDictionary;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma mark - With Margins
|
||||||
|
|
||||||
|
+ (NSLayoutConstraint *)pinViewTopToSuperview:(UIView *)view useMargins:(BOOL)useMargins constant:(CGFloat)constant {
|
||||||
|
return [view.topAnchor constraintEqualToAnchor:(useMargins ? view.superview.layoutMarginsGuide.topAnchor : view.superview.topAnchor) constant:constant];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSLayoutConstraint *)pinViewLeftToSuperview:(UIView *)view useMargins:(BOOL)useMargins constant:(CGFloat)constant {
|
||||||
|
return [view.leftAnchor constraintEqualToAnchor:(useMargins ? view.superview.layoutMarginsGuide.leftAnchor : view.superview.leftAnchor) constant:constant];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSLayoutConstraint *)pinViewRightToSuperview:(UIView *)view useMargins:(BOOL)useMargins constant:(CGFloat)constant {
|
||||||
|
return [(useMargins ? view.superview.layoutMarginsGuide.rightAnchor : view.superview.rightAnchor) constraintEqualToAnchor:view.rightAnchor constant:constant];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSLayoutConstraint *)pinViewBottomToSuperview:(UIView *)view useMargins:(BOOL)useMargins constant:(CGFloat)constant {
|
||||||
|
return [(useMargins ? view.superview.layoutMarginsGuide.bottomAnchor : view.superview.bottomAnchor) constraintEqualToAnchor:view.bottomAnchor constant:constant];
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark - Scaling constraints
|
#pragma mark - Scaling constraints
|
||||||
|
|
||||||
+ (nullable NSDictionary *)scalingConstraintPinSubview:(nullable UIView *)subview pinTop:(BOOL)pinTop topConstant:(CGFloat)topConstant pinBottom:(BOOL)pinBottom bottomConstant:(CGFloat)bottomConstant pinLeft:(BOOL)pinLeft leftConstant:(CGFloat)leftConstant pinRight:(BOOL)pinRight rightConstant:(CGFloat)rightConstant baseConstant:(CGFloat)baseConstant {
|
+ (nullable NSDictionary *)scalingConstraintPinSubview:(nullable UIView *)subview pinTop:(BOOL)pinTop topConstant:(CGFloat)topConstant pinBottom:(BOOL)pinBottom bottomConstant:(CGFloat)bottomConstant pinLeft:(BOOL)pinLeft leftConstant:(CGFloat)leftConstant pinRight:(BOOL)pinRight rightConstant:(CGFloat)rightConstant baseConstant:(CGFloat)baseConstant {
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import UIKit
|
|||||||
public class MoleculeStackView: MFView {
|
public class MoleculeStackView: MFView {
|
||||||
var spacingBlock: ((Any) -> UIEdgeInsets)?
|
var spacingBlock: ((Any) -> UIEdgeInsets)?
|
||||||
var moleculesArray: [UIView]?
|
var moleculesArray: [UIView]?
|
||||||
|
var useMargins: Bool = false
|
||||||
|
|
||||||
public override init(frame: CGRect) {
|
public override init(frame: CGRect) {
|
||||||
super.init(frame: frame)
|
super.init(frame: frame)
|
||||||
@ -67,9 +68,9 @@ public class MoleculeStackView: MFView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let spacingBlock = spacingBlock {
|
if let spacingBlock = spacingBlock {
|
||||||
MVMCoreUIStackableViewController.populateView(self, withUIArray: moleculesArray, withSpacingBlock: spacingBlock)
|
MVMCoreUIStackableViewController.populateView(self, withUIArray: moleculesArray, useMargins: useMargins, withSpacingBlock: spacingBlock)
|
||||||
} else {
|
} else {
|
||||||
MVMCoreUIStackableViewController.populateView(self, withUIArray: moleculesArray) { (object) -> UIEdgeInsets in
|
MVMCoreUIStackableViewController.populateView(self, withUIArray: moleculesArray, useMargins: useMargins) { (object) -> UIEdgeInsets in
|
||||||
if object as AnyObject? === moleculesArray.first {
|
if object as AnyObject? === moleculesArray.first {
|
||||||
return UIEdgeInsets.zero
|
return UIEdgeInsets.zero
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -25,6 +25,11 @@ import UIKit
|
|||||||
super.init(frame: frame)
|
super.init(frame: frame)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func setDefaultCustom() {
|
||||||
|
primaryButton?.setAsStandardCustom()
|
||||||
|
secondaryButton?.setAsSecondaryCustom()
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - MVMCoreViewProtocol
|
// MARK: - MVMCoreViewProtocol
|
||||||
open override func updateView(_ size: CGFloat) {
|
open override func updateView(_ size: CGFloat) {
|
||||||
super.updateView(size)
|
super.updateView(size)
|
||||||
@ -139,8 +144,7 @@ import UIKit
|
|||||||
|
|
||||||
open func set(primaryButtonJSON: [AnyHashable: Any]?, secondaryButtonJSON: [AnyHashable: Any]?, actionDelegate: NSObjectProtocol?, additionalData: [AnyHashable: Any]?, buttonDelegate: Any?) {
|
open func set(primaryButtonJSON: [AnyHashable: Any]?, secondaryButtonJSON: [AnyHashable: Any]?, actionDelegate: NSObjectProtocol?, additionalData: [AnyHashable: Any]?, buttonDelegate: Any?) {
|
||||||
setupUI(withPrimaryButtonMap: primaryButtonJSON, secondaryButtonMap: secondaryButtonJSON, legacy: false)
|
setupUI(withPrimaryButtonMap: primaryButtonJSON, secondaryButtonMap: secondaryButtonJSON, legacy: false)
|
||||||
primaryButton?.setAsStandardCustom()
|
setDefaultCustom()
|
||||||
secondaryButton?.setAsSecondaryCustom()
|
|
||||||
primaryButton?.setWithJSON(primaryButtonJSON, delegate: actionDelegate as? NSObject, additionalData: additionalData)
|
primaryButton?.setWithJSON(primaryButtonJSON, delegate: actionDelegate as? NSObject, additionalData: additionalData)
|
||||||
secondaryButton?.setWithJSON(secondaryButtonJSON, delegate: actionDelegate as? NSObject, additionalData: additionalData)
|
secondaryButton?.setWithJSON(secondaryButtonJSON, delegate: actionDelegate as? NSObject, additionalData: additionalData)
|
||||||
}
|
}
|
||||||
@ -176,7 +180,7 @@ import UIKit
|
|||||||
|
|
||||||
public convenience init(buttonSmall small: Bool, buttonMap: [AnyHashable: Any]?, actionDelegate: NSObjectProtocol?, additionalData: [AnyHashable: AnyHashable]?, buttonDelegate: Any?) {
|
public convenience init(buttonSmall small: Bool, buttonMap: [AnyHashable: Any]?, actionDelegate: NSObjectProtocol?, additionalData: [AnyHashable: AnyHashable]?, buttonDelegate: Any?) {
|
||||||
self.init()
|
self.init()
|
||||||
setup(withButtonMap: buttonMap, actionDelegate: actionDelegate, additionalData: additionalData, buttonDelegate: buttonMap)
|
setup(withButtonMap: buttonMap, actionDelegate: actionDelegate, additionalData: additionalData, buttonDelegate: buttonDelegate)
|
||||||
primaryButton?.setAsSmall(small)
|
primaryButton?.setAsSmall(small)
|
||||||
secondaryButton?.setAsSmall(small)
|
secondaryButton?.setAsSmall(small)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -90,6 +90,7 @@ B3 -> Legal
|
|||||||
+ (CGFloat)defaultVerticalPaddingForApplicationWidth;
|
+ (CGFloat)defaultVerticalPaddingForApplicationWidth;
|
||||||
+ (CGFloat)defaultHorizontalPaddingForSize:(CGFloat)size;
|
+ (CGFloat)defaultHorizontalPaddingForSize:(CGFloat)size;
|
||||||
+ (CGFloat)defaultVerticalPaddingForSize:(CGFloat)size;
|
+ (CGFloat)defaultVerticalPaddingForSize:(CGFloat)size;
|
||||||
|
+ (void)setDefaultMarginsForView:(nullable UIView *)view size:(CGFloat)size;
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
// Returns the fonts for these styles. Scales them as needed by default
|
// Returns the fonts for these styles. Scales them as needed by default
|
||||||
|
|||||||
@ -12,6 +12,7 @@
|
|||||||
#import "UIColor+MFConvenience.h"
|
#import "UIColor+MFConvenience.h"
|
||||||
#import "NSLayoutConstraint+MFConvenience.h"
|
#import "NSLayoutConstraint+MFConvenience.h"
|
||||||
#import "MVMCoreUISplitViewController.h"
|
#import "MVMCoreUISplitViewController.h"
|
||||||
|
@import MVMCore.MVMCoreDispatchUtility;
|
||||||
|
|
||||||
CGFloat const PaddingDefault = 24;
|
CGFloat const PaddingDefault = 24;
|
||||||
CGFloat const PaddingDefaultHorizontalSpacing = 32;
|
CGFloat const PaddingDefaultHorizontalSpacing = 32;
|
||||||
@ -88,6 +89,17 @@ CGFloat const LabelWithInternalButtonLineSpace = 2;
|
|||||||
return [[MFSizeObject sizeObjectWithScalingStandardSize:PaddingDefaultVerticalSpacing] getValueBasedOnSize:size];
|
return [[MFSizeObject sizeObjectWithScalingStandardSize:PaddingDefaultVerticalSpacing] getValueBasedOnSize:size];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (void)setDefaultMarginsForView:(nullable UIView *)view size:(CGFloat)size {
|
||||||
|
[MVMCoreDispatchUtility performBlockOnMainThread:^{
|
||||||
|
CGFloat padding = [MFStyler defaultHorizontalPaddingForSize:size];
|
||||||
|
if (@available(iOS 11.0, *)) {
|
||||||
|
view.directionalLayoutMargins = NSDirectionalEdgeInsetsMake(0, padding, 0, padding);
|
||||||
|
} else {
|
||||||
|
view.layoutMargins = UIEdgeInsetsMake(0, padding, 0, padding);
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark - 2.0 fonts
|
#pragma mark - 2.0 fonts
|
||||||
|
|
||||||
+ (nullable UIFont *)fontH1:(BOOL)genericScaling {
|
+ (nullable UIFont *)fontH1:(BOOL)genericScaling {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user