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:
parent
d3dbfdd997
commit
439261e4c4
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user