// // PrimaryButtonView.m // myverizon // // Created by Scott Pfeil on 12/11/15. // Copyright © 2015 Verizon Wireless. All rights reserved. // #import "PrimaryButtonView.h" #import #import #import #import "MVMCoreUICommonViewsUtility.h" #import "MVMCoreUIConstants.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 *horizontalConstraints; @end @implementation PrimaryButtonView - (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; } - (nonnull instancetype)initButtonSmall:(BOOL)small buttonMap:(nullable NSDictionary *)buttonMap actionDelegate:(nullable NSObject *)actionDelegate additionalData:(nullable NSDictionary *)additionalData buttonDelegate:(nullable id )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 *)actionDelegate additionalData:(nullable NSDictionary *)additionalData buttonDelegate:(nullable id )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 *)actionDelegate additionalData:(nullable NSDictionary *)additionalData buttonDelegate:(nullable id )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 *)actionDelegate additionalData:(nullable NSDictionary *)additionalData buttonDelegate:(nullable id )buttonDelegate { if (primaryButtonMap && secondaryButtonMap) { self.height.active = NO; // Setup with two buttons if (!self.primaryButton || !self.secondaryButton) { [self removeSubviews]; self.twoButtonView = nil; [self setupWithTwoButtons]; } [self.primaryButton setWithActionMap:primaryButtonMap actionDelegate:actionDelegate additionalData:additionalData buttonDelegate:buttonDelegate]; [self.secondaryButton setWithActionMap:secondaryButtonMap actionDelegate:actionDelegate additionalData:additionalData buttonDelegate:buttonDelegate]; } 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]; } [self alignCenter]; if (primaryButtonMap) { // Only primary button [self.primaryButton setWithActionMap:primaryButtonMap actionDelegate:actionDelegate additionalData:additionalData buttonDelegate:buttonDelegate]; self.primaryButton.bordered = NO; } else { // Only secondary button [self.primaryButton setWithActionMap:secondaryButtonMap actionDelegate:actionDelegate additionalData:additionalData buttonDelegate:buttonDelegate]; self.primaryButton.bordered = YES; } } 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; } - (void)updateView:(CGFloat)size { [super updateView:size]; [MVMCoreDispatchUtility performBlockOnMainThread:^{ [self.primaryButton updateView:size]; [self.secondaryButton updateView:size]; }]; } - (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