Make Link subclass from View instead of MFCustomButton

The bounds of the Link often extend far beyond the width of the button text, which, if MFCustomButton is used, extend the tappable area far beyond the link.
This commit is contained in:
Robinson, Blake 2019-12-12 15:23:30 -05:00
parent d3dbfdd997
commit 439261e4c4

View File

@ -8,7 +8,7 @@
import UIKit
@objcMembers open class Link: MFCustomButton {
@objcMembers open class Link: View {
private lazy var sizeObject: MFSizeObject? = {
return MFSizeObject(standardSize: 30, standardiPadPortraitSize: 36, iPadProLandscapeSize: 42)
@ -16,6 +16,7 @@ import UIKit
private var additionalData: [AnyHashable: Any]?
private var delegateObject: MVMCoreUIDelegateObject?
public let linkButton = MFCustomButton()
public override init(frame: CGRect) {
super.init(frame: frame)
@ -28,12 +29,12 @@ import UIKit
}
open override func draw(_ rect: CGRect) {
guard let textRect = self.titleLabel?.frame else { return }
guard let textRect = self.linkButton.titleLabel?.frame else { return }
let contextRef = UIGraphicsGetCurrentContext()
//set to the same color as the text
if let color = self.titleLabel?.textColor?.cgColor {
if let color = self.linkButton.titleLabel?.textColor?.cgColor {
contextRef?.setStrokeColor(color)
}
@ -49,86 +50,97 @@ import UIKit
}
override open func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
let faultTolerance: CGFloat = 20.0
let area = bounds.insetBy(dx: -faultTolerance, dy: -faultTolerance)
let area = linkButton.bounds.insetBy(dx: -faultTolerance, dy: -faultTolerance)
return area.contains(point)
}
open override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
MVMCoreActionHandler.shared()?.handleAction(with: actionMap, additionalData: additionalData, delegateObject: delegateObject)
if linkButton.isEnabled {
MVMCoreActionHandler.shared()?.handleAction(with: linkButton.actionMap, additionalData: additionalData, delegateObject: delegateObject)
}
}
}
extension Link: MVMCoreViewProtocol {
//MARK: MVMCoreViewProtocol
extension Link {
public func updateView(_ size: CGFloat) {
public override 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 }
self.linkButton.titleLabel?.font = MFStyler.fontB2(forWidth: width)
guard let heightConstraint = self.linkButton.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)
self.linkButton.heightConstraint?.constant = sizeObject.getValueBased(onSize: width)
}
})
}
public func setupView() {
public override func setupView() {
linkButton.isUserInteractionEnabled = false
linkButton.translatesAutoresizingMaskIntoConstraints = false
addSubview(linkButton)
NSLayoutConstraint.activate([
linkButton.leadingAnchor.constraint(equalTo: leadingAnchor),
linkButton.topAnchor.constraint(equalTo: topAnchor),
trailingAnchor.constraint(greaterThanOrEqualTo: linkButton.trailingAnchor),
bottomAnchor.constraint(equalTo: linkButton.bottomAnchor)
])
translatesAutoresizingMaskIntoConstraints = false
backgroundColor = .clear
contentMode = .redraw
setTitleColor(.mfTextButton(), for: .normal)
setTitleColor(.mfCharcoal(), for: .highlighted)
// left alignment by default
titleLabel?.textAlignment = .left
contentHorizontalAlignment = .left
linkButton.setTitleColor(.mfTextButton(), for: .normal)
linkButton.setTitleColor(.mfCharcoal(), for: .highlighted)
linkButton.titleLabel?.textAlignment = .left
linkButton.contentHorizontalAlignment = .left
if let constant = self.sizeObject?.standardSize {
let heightConstraint = NSLayoutConstraint(item: self as Any, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: constant)
addConstraint(heightConstraint)
heightConstraint.isActive = true
self.heightConstraint = heightConstraint
self.linkButton.heightConstraint = heightConstraint
}
}
}
extension Link: MVMCoreUIMoleculeViewProtocol {
//MARK: MVMCoreUIMoleculeViewProtocol
extension Link {
public func reset() {
self.setTitleColor(.mfTextButton(), for: .normal)
public override func reset() {
self.linkButton.setTitleColor(.mfTextButton(), for: .normal)
self.linkButton.isEnabled = true
}
public func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
public override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
if let unwrappedJson = json {
actionMap = unwrappedJson
linkButton.actionMap = unwrappedJson
self.additionalData = additionalData
self.delegateObject = delegateObject
buttonDelegate = delegateObject?.buttonDelegate
linkButton.buttonDelegate = delegateObject?.buttonDelegate
let color = unwrappedJson.stringForkey(KeyTextColor)
setTitleColor(.mfGet(forHex: color), for: .normal)
linkButton.setTitleColor(.mfGet(forHex: color), for: .normal)
titleLabel?.numberOfLines = 0
titleLabel?.lineBreakMode = .byWordWrapping;
setTitle(actionMap?.stringForkey(KeyTitle), for: .normal)
linkButton.titleLabel?.numberOfLines = 0
linkButton.titleLabel?.lineBreakMode = .byWordWrapping;
linkButton.setTitle(linkButton.actionMap?.stringForkey(KeyTitle), for: .normal)
if let enabled = unwrappedJson[KeyEnabled] as? Bool {
isEnabled = enabled
linkButton.isEnabled = enabled
}
}
if let title = self.title(for: .normal),
if let title = self.linkButton.title(for: .normal),
title.isEmpty {
self.heightConstraint?.constant = 0
self.linkButton.heightConstraint?.constant = 0
} else {
guard let standardSize = sizeObject?.standardSize else { return }
heightConstraint?.constant = standardSize
linkButton.heightConstraint?.constant = standardSize
}
}