Creates Link atom to replace MFTextButton

This commit is contained in:
Robinson, Blake 2019-12-02 11:15:50 -05:00
parent 88e079e6be
commit 988e30daa9
4 changed files with 161 additions and 0 deletions

View File

@ -32,6 +32,7 @@
943784F6236B77BB006A1E82 /* GraphViewAnimationHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 943784F4236B77BB006A1E82 /* GraphViewAnimationHandler.swift */; };
9455B19C234F8A0400A574DB /* MVMAnimationFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */; };
948DB67E2326DCD90011F916 /* MultiProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 948DB67D2326DCD90011F916 /* MultiProgress.swift */; };
C07065C42395677300FBF997 /* Link.swift in Sources */ = {isa = PBXBuildFile; fileRef = C07065C32395677300FBF997 /* Link.swift */; };
D20A9A5E2243D3E300ADE781 /* TwoButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */; };
D213347723843825008E41B3 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = D213347623843825008E41B3 /* Line.swift */; };
D224798A2314445E003FCCF9 /* LabelSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479892314445E003FCCF9 /* LabelSwitch.swift */; };
@ -228,6 +229,7 @@
943784F4236B77BB006A1E82 /* GraphViewAnimationHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphViewAnimationHandler.swift; sourceTree = "<group>"; };
9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MVMAnimationFramework.framework; path = ../SharedFrameworks/MVMAnimationFramework.framework; sourceTree = "<group>"; };
948DB67D2326DCD90011F916 /* MultiProgress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiProgress.swift; sourceTree = "<group>"; };
C07065C32395677300FBF997 /* Link.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Link.swift; sourceTree = "<group>"; };
D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwoButtonView.swift; sourceTree = "<group>"; };
D213347623843825008E41B3 /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = "<group>"; };
D22479892314445E003FCCF9 /* LabelSwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelSwitch.swift; sourceTree = "<group>"; };
@ -729,6 +731,7 @@
D282AACA2243C61700C46919 /* ButtonView.swift */,
D29DF16D21E69E1F003B2FB9 /* MFTextButton.h */,
D29DF17221E69E1F003B2FB9 /* MFTextButton.m */,
C07065C32395677300FBF997 /* Link.swift */,
);
path = Buttons;
sourceTree = "<group>";
@ -1060,6 +1063,7 @@
943784F5236B77BB006A1E82 /* GraphView.swift in Sources */,
D29DF32121ED0CBA003B2FB9 /* LabelView.m in Sources */,
DBC4391822442197001AB423 /* CaretView.swift in Sources */,
C07065C42395677300FBF997 /* Link.swift in Sources */,
D29770F221F7C6D600B2F0D0 /* TopLabelsAndBottomButtonsTableViewController.m in Sources */,
D29B771022C281F400D6ACE0 /* ModuleMolecule.swift in Sources */,
DBC4391922442197001AB423 /* DashLine.swift in Sources */,

View File

@ -0,0 +1,155 @@
//
// Link.swift
// MVMCoreUI
//
// Created by Robinson, Blake on 11/26/19.
// Copyright © 2019 Verizon Wireless. All rights reserved.
//
import UIKit
@objcMembers open class Link: MFCustomButton {
lazy var sizeObject:MFSizeObject? = {
return MFSizeObject(standardSize: 30, standardiPadPortraitSize: 36, iPadProLandscapeSize: 42)
}()
public override init(frame: CGRect) {
super.init(frame: frame)
self.setupView()
}
public required init?(coder: NSCoder) {
super.init(coder: coder)
self.setupView()
}
open override func draw(_ rect: CGRect) {
guard let textRect = self.titleLabel?.frame else { return }
let contextRef = UIGraphicsGetCurrentContext()
//set to the same color as the text
if let color = self.titleLabel?.textColor?.cgColor {
contextRef?.setStrokeColor(color)
}
//x should be according to the text, not the button
let x = textRect.origin.x
// line is 1 point below the text
let y = textRect.origin.y + textRect.size.height + 1
contextRef?.move(to: CGPoint(x: x, y: y))
contextRef?.addLine(to: CGPoint(x: x + textRect.size.width, y: y))
contextRef?.closePath()
contextRef?.drawPath(using: .stroke)
}
public static func link() -> Link {
return Link.link(nil, constrainHeight: true, width: CGFloat.leastNormalMagnitude)
}
public static func link(_ button: UIButton?, constrainHeight: Bool, width:CGFloat) -> Link {
let link = linkHelper(button)
//Adds the height constraint.
if let constant = link.sizeObject?.standardSize,
constrainHeight {
let heightConstraint = NSLayoutConstraint(item: link as Any, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: constant)
link.addConstraint(heightConstraint)
heightConstraint.isActive = true
link.heightConstraint = heightConstraint
} else {
link.setContentHuggingPriority(.required, for: .vertical)
}
link.updateView(width)
return link
}
public static func linkHelper(_ button: UIButton?) -> Link {
guard let unwrappedButton = button else { return Link(type:.custom) }
guard let link = unwrappedButton as? Link else { return Link(type:.custom) }
return link
}
}
extension Link: MVMCoreViewProtocol {
public func updateView(_ size: CGFloat) {
MVMCoreDispatchUtility.performBlock(onMainThread: { [weak self] in
guard let self = self else { return }
var width = size
if MVMCoreGetterUtility.fequal(a: Float(CGFloat.leastNormalMagnitude), b: Float(size)) {
width = MVMCoreUISplitViewController.getApplicationViewWidth()
}
self.titleLabel?.font = MFStyler.fontB2(forWidth: width)
guard let heightConstraint = self.heightConstraint else { return }
if !MVMCoreGetterUtility.fequal(a: 0, b: Float(heightConstraint.constant)) {
guard let sizeObject = self.sizeObject else { return }
self.heightConstraint?.constant = sizeObject.getValueBased(onSize: width)
}
})
}
public func setupView() {
self.translatesAutoresizingMaskIntoConstraints = false;
self.backgroundColor = .clear
self.contentMode = .redraw
self.setTitleColor(UIColor.mfTextButton(), for: .normal)
self.setTitleColor(UIColor.mfCharcoal(), for: .highlighted)
// left alignment by default
self.titleLabel?.textAlignment = .left
self.contentHorizontalAlignment = .left
}
}
extension Link: MVMCoreUIMoleculeViewProtocol {
public func reset() {
self.setTitleColor(UIColor.mfTextButton(), for: .normal)
}
public func setWithJSON(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) {
if let unwrappedJson = json {
let color = unwrappedJson.stringForkey(KeyTextColor)
setTitleColor(UIColor.mfGet(forHex: color), for: .normal)
setWithActionMap(json, delegateObject: delegateObject, additionalData: additionalData)
//enabling must happen after setWithActionMap is called because
//that method enables buttons when the actionMap does not contain
//disableAction = true
if let enabled = unwrappedJson[KeyEnabled] as? Bool {
isEnabled = enabled
}
}
if let title = self.title(for: .normal),
title.isEmpty {
self.heightConstraint?.constant = 0
} else {
guard let standardSize = sizeObject?.standardSize else { return }
self.heightConstraint?.constant = standardSize
}
}
public static func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat {
return 31
}
}
extension Link: MVMCoreUIViewConstrainingProtocol {
public func needsToBeConstrained() -> Bool {
return true
}
public func alignment() -> UIStackView.Alignment {
return .leading
}
}

View File

@ -22,6 +22,7 @@ extern NSString * const KeyDisableButton;
extern NSString * const KeyValue;
extern NSString * const KeyLabel;
extern NSString * const KeyDisable;
extern NSString * const KeyEnabled;
extern NSString * const KeyFieldName;
extern NSString * const KeyHideMainMenu;

View File

@ -21,6 +21,7 @@ NSString * const KeyDisableButton = @"disableAction";
NSString * const KeyValue = @"value";
NSString * const KeyLabel = @"label";
NSString * const KeyDisable = @"disable";
NSString * const KeyEnabled = @"enabled";
NSString * const KeyFieldName = @"fieldName";
NSString * const KeyFieldKey = @"fieldKey";
NSString * const KeyRequired = @"required";