351 lines
15 KiB
Objective-C
351 lines
15 KiB
Objective-C
//
|
|
// PrimaryButtonView.m
|
|
// myverizon
|
|
//
|
|
// Created by Scott Pfeil on 12/11/15.
|
|
// Copyright © 2015 Verizon Wireless. All rights reserved.
|
|
//
|
|
|
|
#import "PrimaryButtonView.h"
|
|
#import <MVMCore/NSDictionary+MFConvenience.h>
|
|
#import <MVMCore/MVMCoreDispatchUtility.h>
|
|
#import <MVMCore/MVMCoreJSONConstants.h>
|
|
#import "MVMCoreUICommonViewsUtility.h"
|
|
#import "MVMCoreUIConstants.h"
|
|
#import "UIColor+MFConvenience.h"
|
|
|
|
@interface PrimaryButtonView ()
|
|
|
|
@property (weak, nonatomic) UIView *twoButtonView;
|
|
@property (weak, nonatomic) NSLayoutConstraint *alignCenterPin;
|
|
@property (weak, nonatomic) NSLayoutConstraint *alignCenterLeftPin;
|
|
@property (weak, nonatomic) NSLayoutConstraint *alignCenterRightPin;
|
|
@property (weak, nonatomic) NSLayoutConstraint *height;
|
|
|
|
@property (nonatomic, strong) NSArray<NSLayoutConstraint *> *horizontalConstraints;
|
|
|
|
@end
|
|
|
|
@implementation PrimaryButtonView
|
|
|
|
- (void)updateView:(CGFloat)size {
|
|
[super updateView:size];
|
|
[MVMCoreDispatchUtility performBlockOnMainThread:^{
|
|
[self.primaryButton updateView:size];
|
|
[self.secondaryButton updateView:size];
|
|
}];
|
|
}
|
|
|
|
- (void)setWithJSON:(NSDictionary *)json delegate:(NSObject *)delegate additionalData:(nullable NSDictionary *)additionalData {
|
|
[super setWithJSON:json delegate:delegate additionalData:additionalData];
|
|
NSString *backgroundColorString = [json string:@"backgroundColor"];
|
|
if (backgroundColorString) {
|
|
self.backgroundColor = [UIColor mfGetColorForHex:backgroundColorString];
|
|
}
|
|
NSDictionary *primaryButtonMap = [json dict:@"primaryButton"];
|
|
NSDictionary *secondaryButtonMap = [json dict:@"secondaryButton"];
|
|
[self setupUIWithPrimaryButtonMap:primaryButtonMap secondaryButtonMap:secondaryButtonMap];
|
|
[self.primaryButton setAsStandardCustom];
|
|
[self.secondaryButton setAsSecondaryCustom];
|
|
[self.primaryButton setWithJSON:primaryButtonMap delegate:delegate additionalData:additionalData];
|
|
[self.secondaryButton setWithJSON:secondaryButtonMap delegate:delegate additionalData:additionalData];
|
|
}
|
|
|
|
#pragma mark - Inits
|
|
|
|
- (instancetype)init {
|
|
if (self = [super init]) {
|
|
self.backgroundColor = [UIColor clearColor];
|
|
self.translatesAutoresizingMaskIntoConstraints = NO;
|
|
[self setupWithSingleButton];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
|
|
if (self = [super initWithCoder:aDecoder]) {
|
|
self.backgroundColor = [UIColor clearColor];
|
|
self.translatesAutoresizingMaskIntoConstraints = NO;
|
|
[self setupWithSingleButton];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (instancetype)initWithFrame:(CGRect)frame {
|
|
if (self = [super initWithFrame:frame]) {
|
|
self.backgroundColor = [UIColor clearColor];
|
|
self.translatesAutoresizingMaskIntoConstraints = NO;
|
|
[self setupWithSingleButton];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (nonnull instancetype)initButtonSmall:(BOOL)small enabled:(BOOL)enabled {
|
|
if (self = [self init]) {
|
|
[self.primaryButton setAsSmallButton:small];
|
|
[self.primaryButton setEnabled:enabled];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (nonnull instancetype)initWithTwoButtons {
|
|
if (self = [self init]) {
|
|
[self setupWithTwoButtons];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
#pragma mark - Legacy Setup
|
|
|
|
- (nonnull instancetype)initButtonSmall:(BOOL)small buttonMap:(nullable NSDictionary *)buttonMap actionDelegate:(nullable NSObject <MVMCoreActionDelegateProtocol>*)actionDelegate additionalData:(nullable NSDictionary *)additionalData buttonDelegate:(nullable id <ButtonDelegateProtocol>)buttonDelegate {
|
|
if (self = [self init]) {
|
|
[self setupWithButtonMap:buttonMap actionDelegate:actionDelegate additionalData:additionalData buttonDelegate:buttonDelegate];
|
|
[self.primaryButton setAsSmallButton:small];
|
|
[self.secondaryButton setAsSmallButton:small];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (nonnull instancetype)initWithPrimaryButtonMap:(nullable NSDictionary *)primaryButtonMap secondaryButtonMap:(nullable NSDictionary *)secondaryButtonMap actionDelegate:(nullable NSObject <MVMCoreActionDelegateProtocol>*)actionDelegate additionalData:(nullable NSDictionary *)additionalData buttonDelegate:(nullable id <ButtonDelegateProtocol>)buttonDelegate {
|
|
if (self = [self init]) {
|
|
[self setupWithPrimaryButtonMap:primaryButtonMap secondaryButtonMap:secondaryButtonMap actionDelegate:actionDelegate additionalData:additionalData buttonDelegate:buttonDelegate];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)setupWithButtonMap:(nullable NSDictionary *)buttonMap actionDelegate:(nullable NSObject <MVMCoreActionDelegateProtocol>*)actionDelegate additionalData:(nullable NSDictionary *)additionalData buttonDelegate:(nullable id <ButtonDelegateProtocol>)buttonDelegate {
|
|
NSDictionary *secondaryButtonMap = [buttonMap dict:KeySecondaryButton];
|
|
NSDictionary *primaryButtonMap = [buttonMap dict:KeyPrimaryButton];
|
|
[self setupWithPrimaryButtonMap:primaryButtonMap secondaryButtonMap:secondaryButtonMap actionDelegate:actionDelegate additionalData:additionalData buttonDelegate:buttonDelegate];
|
|
}
|
|
|
|
- (void)setupWithPrimaryButtonMap:(nullable NSDictionary *)primaryButtonMap secondaryButtonMap:(nullable NSDictionary *)secondaryButtonMap actionDelegate:(nullable NSObject <MVMCoreActionDelegateProtocol>*)actionDelegate additionalData:(nullable NSDictionary *)additionalData buttonDelegate:(nullable id <ButtonDelegateProtocol>)buttonDelegate {
|
|
[self setupUIWithPrimaryButtonMap:primaryButtonMap secondaryButtonMap:secondaryButtonMap];
|
|
if (self.primaryButton && self.secondaryButton) {
|
|
[self.primaryButton setWithActionMap:primaryButtonMap actionDelegate:actionDelegate additionalData:additionalData buttonDelegate:buttonDelegate];
|
|
[self.secondaryButton setWithActionMap:secondaryButtonMap actionDelegate:actionDelegate additionalData:additionalData buttonDelegate:buttonDelegate];
|
|
} else if (self.primaryButton) {
|
|
[self.primaryButton setWithActionMap:primaryButtonMap actionDelegate:actionDelegate additionalData:additionalData buttonDelegate:buttonDelegate];
|
|
self.primaryButton.bordered = NO;
|
|
} else {
|
|
[self.primaryButton setWithActionMap:secondaryButtonMap actionDelegate:actionDelegate additionalData:additionalData buttonDelegate:buttonDelegate];
|
|
self.primaryButton.bordered = YES;
|
|
}
|
|
}
|
|
|
|
#pragma mark - Setup
|
|
|
|
- (void)setupUIWithPrimaryButtonMap:(nullable NSDictionary *)primaryButtonMap secondaryButtonMap:(nullable NSDictionary *)secondaryButtonMap {
|
|
if (primaryButtonMap && secondaryButtonMap) {
|
|
self.height.active = NO;
|
|
|
|
// Setup with two buttons
|
|
if (!self.primaryButton || !self.secondaryButton) {
|
|
[self removeSubviews];
|
|
self.twoButtonView = nil;
|
|
[self setupWithTwoButtons];
|
|
}
|
|
} else if (primaryButtonMap || secondaryButtonMap) {
|
|
self.height.active = NO;
|
|
|
|
// Setup with one button.
|
|
if (!self.primaryButton || self.secondaryButton) {
|
|
[self removeSubviews];
|
|
self.primaryButton = nil;
|
|
self.secondaryButton = nil;
|
|
[self setupWithSingleButton];
|
|
}
|
|
} else {
|
|
[self removeSubviews];
|
|
if (!self.height) {
|
|
NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:0];
|
|
height.active = YES;
|
|
self.height = height;
|
|
}
|
|
}
|
|
}
|
|
|
|
- (id)createButton {
|
|
return [PrimaryButton primaryButton:NO];
|
|
}
|
|
|
|
- (void)setupWithTwoButtons {
|
|
if (self.primaryButton) {
|
|
[self.primaryButton removeFromSuperview];
|
|
self.primaryButton = nil;
|
|
}
|
|
|
|
if (!self.twoButtonView) {
|
|
self.backgroundColor = [UIColor clearColor];
|
|
self.translatesAutoresizingMaskIntoConstraints = NO;
|
|
|
|
UIView *buttonView = [MVMCoreUICommonViewsUtility commonView];
|
|
|
|
PrimaryButton *leftButton = [PrimaryButton primaryButton];
|
|
leftButton.bordered = YES;
|
|
leftButton.translatesAutoresizingMaskIntoConstraints = NO;
|
|
[buttonView addSubview:leftButton];
|
|
self.secondaryButton = leftButton;
|
|
|
|
PrimaryButton *rightButton = [PrimaryButton primaryButton];
|
|
rightButton.translatesAutoresizingMaskIntoConstraints = NO;
|
|
[buttonView addSubview:rightButton];
|
|
self.primaryButton = rightButton;
|
|
|
|
[rightButton.widthAnchor constraintEqualToAnchor:leftButton.widthAnchor multiplier:1].active = YES;
|
|
|
|
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[leftButton]-0-|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:NSDictionaryOfVariableBindings(leftButton)]];
|
|
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[rightButton]-0-|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:NSDictionaryOfVariableBindings(rightButton)]];
|
|
self.horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[leftButton]-10-[rightButton]-0-|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:NSDictionaryOfVariableBindings(leftButton,rightButton)];
|
|
[NSLayoutConstraint activateConstraints:self.horizontalConstraints];
|
|
[self addSubview:buttonView];
|
|
|
|
[self setupAlignmentsWithView:buttonView];
|
|
|
|
self.twoButtonView = buttonView;
|
|
|
|
[self alignCenter];
|
|
}
|
|
}
|
|
|
|
- (void)setupWithSingleButton {
|
|
|
|
if (!self.primaryButton) {
|
|
self.backgroundColor = [UIColor clearColor];
|
|
self.translatesAutoresizingMaskIntoConstraints = NO;
|
|
|
|
PrimaryButton *button = [self createButton];
|
|
button.translatesAutoresizingMaskIntoConstraints = NO;
|
|
[self addSubview:button];
|
|
self.primaryButton = button;
|
|
|
|
[self setupAlignmentsWithView:button];
|
|
|
|
[self alignCenter];
|
|
}
|
|
}
|
|
|
|
- (void)setupAlignmentsWithView:(UIView *)view {
|
|
// Align left and right constants.
|
|
NSLayoutConstraint *leftPin = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0];
|
|
self.leftPin = leftPin;
|
|
leftPin.active = YES;
|
|
|
|
NSLayoutConstraint *topPin = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0];
|
|
self.topPin = topPin;
|
|
topPin.active = YES;
|
|
|
|
NSLayoutConstraint *bottomPin = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0];
|
|
self.bottomPin = bottomPin;
|
|
bottomPin.active = YES;
|
|
|
|
NSLayoutConstraint *rightPin = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeRight multiplier:1.0 constant:0];
|
|
self.rightPin = rightPin;
|
|
rightPin.active = YES;
|
|
|
|
// Center alignments
|
|
NSLayoutConstraint *alignCenter = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0];
|
|
self.alignCenterPin = alignCenter;
|
|
alignCenter.active = YES;
|
|
|
|
NSLayoutConstraint *centerLeftPin = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:self attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0];
|
|
self.alignCenterLeftPin = centerLeftPin;
|
|
centerLeftPin.active = YES;
|
|
|
|
NSLayoutConstraint *centerRightPin = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:view attribute:NSLayoutAttributeRight multiplier:1.0 constant:0];
|
|
self.alignCenterRightPin = centerRightPin;
|
|
centerRightPin.active = YES;
|
|
}
|
|
|
|
#pragma mark - Configuring
|
|
|
|
- (void)alignLeft {
|
|
self.alignCenterPin.active = NO;
|
|
self.alignCenterLeftPin.active = NO;
|
|
self.alignCenterRightPin.active = YES;
|
|
self.leftPin.active = YES;
|
|
self.rightPin.active = NO;
|
|
}
|
|
|
|
- (void)alignCenter {
|
|
self.alignCenterPin.active = YES;
|
|
self.alignCenterLeftPin.active = YES;
|
|
self.alignCenterRightPin.active = YES;
|
|
self.leftPin.active = NO;
|
|
self.rightPin.active = NO;
|
|
}
|
|
|
|
- (void)alignFill {
|
|
self.alignCenterPin.active = NO;
|
|
self.alignCenterLeftPin.active = NO;
|
|
self.alignCenterRightPin.active = NO;
|
|
self.leftPin.active = YES;
|
|
self.rightPin.active = YES;
|
|
}
|
|
|
|
- (void)alignRight {
|
|
self.alignCenterPin.active = NO;
|
|
self.alignCenterLeftPin.active = YES;
|
|
self.alignCenterRightPin.active = NO;
|
|
self.leftPin.active = NO;
|
|
self.rightPin.active = YES;
|
|
}
|
|
|
|
- (void)setLeftPinConstant:(CGFloat)constant {
|
|
[super setLeftPinConstant:constant];
|
|
self.alignCenterLeftPin.constant = constant;
|
|
}
|
|
|
|
- (void)setRightPinConstant:(CGFloat)constant {
|
|
[super setRightPinConstant:constant];
|
|
self.alignCenterRightPin.constant = constant;
|
|
}
|
|
|
|
- (void)resetConstraints {
|
|
[super resetConstraints];
|
|
self.primaryButton.enabled = NO;
|
|
}
|
|
|
|
- (void)hidePrimaryLeftButton {
|
|
if (!self.secondaryButton.hidden) {
|
|
self.secondaryButton.hidden = YES;
|
|
PrimaryButton *rightButton = self.primaryButton;
|
|
[NSLayoutConstraint deactivateConstraints:self.horizontalConstraints];
|
|
self.horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[rightButton]-0-|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:NSDictionaryOfVariableBindings(rightButton)];
|
|
[NSLayoutConstraint activateConstraints:self.horizontalConstraints];
|
|
}
|
|
}
|
|
|
|
- (void)hidePrimaryRightButton {
|
|
if (!self.primaryButton.hidden) {
|
|
self.primaryButton.hidden = YES;
|
|
PrimaryButton *leftButton = self.secondaryButton;
|
|
[NSLayoutConstraint deactivateConstraints:self.horizontalConstraints];
|
|
self.horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[leftButton]-0-|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:NSDictionaryOfVariableBindings(leftButton)];
|
|
[NSLayoutConstraint activateConstraints:self.horizontalConstraints];
|
|
}
|
|
}
|
|
|
|
- (void)showBothPrimaryButtons {
|
|
self.primaryButton.hidden = NO;
|
|
self.secondaryButton.hidden = NO;
|
|
PrimaryButton *rightButton = self.primaryButton;
|
|
PrimaryButton *leftButton = self.secondaryButton;
|
|
[NSLayoutConstraint deactivateConstraints:self.horizontalConstraints];
|
|
self.horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[leftButton]-10-[rightButton]-0-|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:NSDictionaryOfVariableBindings(leftButton,rightButton)];
|
|
[NSLayoutConstraint activateConstraints:self.horizontalConstraints];
|
|
}
|
|
|
|
- (void)hideBothPrimaryButtons {
|
|
self.primaryButton.hidden = YES;
|
|
self.secondaryButton.hidden = YES;
|
|
}
|
|
|
|
- (void)removeSubviews {
|
|
for (UIView *view in self.subviews) {
|
|
[view removeFromSuperview];
|
|
}
|
|
}
|
|
|
|
@end
|