diff --git a/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift b/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift index 73de7760..15cf5a22 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift @@ -241,15 +241,38 @@ public typealias ActionBlock = () -> () public func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { clauses = [] - - guard let labelModel = model as? LabelModel else { - text = "" - return - } - + text = nil attributedText = nil originalAttributedString = nil + + guard let labelModel = model as? LabelModel else { return } + text = labelModel.text + + /* + * This is to address a reuse issue with iOS 13 and up. + * Even if you set text & attributedText to nil, the moment you set text with a value, + * attributedText will hold a dirty value from a previously reused cell even if reset() is + * appropriately called. + * Only other reference found of issue: https://www.thetopsites.net/article/58142205.shtml + */ + if #available(iOS 13, *) { + if let attributedText = attributedText, let text = text { + let attributedString = NSMutableAttributedString(string: text) + let range = NSRange(location: 0, length: text.count) + for attribute in attributedText.attributes(at: 0, effectiveRange: nil) { + if attribute.key == .underlineStyle { + attributedString.addAttribute(.underlineStyle, value: 0, range: range) + } + if attribute.key == .strikethroughStyle { + attributedString.addAttribute(.strikethroughStyle, value: 0, range: range) + } + } + + self.attributedText = attributedString + } + } + hero = labelModel.hero Label.setLabel(self, withHTML: labelModel.html) isAccessibilityElement = hasText @@ -257,8 +280,10 @@ public typealias ActionBlock = () -> () switch labelModel.textAlignment { case .center: textAlignment = .center + case .right: textAlignment = .right + default: textAlignment = .left } @@ -290,7 +315,7 @@ public typealias ActionBlock = () -> () if let color = labelModel.textColor { textColor = color.uiColor } - + if let attributes = labelModel.attributes, let labelText = text { let attributedString = NSMutableAttributedString(string: labelText, attributes: [NSAttributedString.Key.font: font.updateSize(standardFontSize), NSAttributedString.Key.foregroundColor: textColor as UIColor]) @@ -359,7 +384,7 @@ public typealias ActionBlock = () -> () continue } } - + attributedText = attributedString originalAttributedString = attributedText } @@ -503,11 +528,11 @@ public typealias ActionBlock = () -> () textColor = .mvmBlack setScale(scale) } - + //------------------------------------------------------ // MARK: - 2.0 Styling Methods //------------------------------------------------------ - + @objc public func styleH1(_ scale: Bool) { MFStyler.styleLabelH1(self, genericScaling: false) setScale(scale) @@ -548,6 +573,23 @@ public typealias ActionBlock = () -> () setScale(scale) } + /// Will remove the values contained in attributedText. + func clearAttributes() { + + guard let labelText = text, + let attributes = attributedText?.attributes(at: 0, longestEffectiveRange: nil, in: NSRange(location: 0, length: labelText.count)) + else { return } + + let attributedString = NSMutableAttributedString(string: labelText) + + for attribute in attributes { + attributedString.removeAttribute(attribute.key, range: NSRange(location: 0, length: labelText.count)) + } + + attributedText = attributedString + } + + @objc public func updateView(_ size: CGFloat) { scaleSize = size as NSNumber @@ -835,7 +877,7 @@ extension Label { /// Converts the entire text into a link. All characters will be underlined and the intrinsic bounds will respond to tap. @objc public func makeTextButton(actionBlock: @escaping ActionBlock) { - + setTextLinkState(range: getRange, actionBlock: actionBlock) } @@ -920,7 +962,7 @@ extension Label { } @objc public func accessibilityCustomAction(_ action: UIAccessibilityCustomAction) { - + for clause in clauses { if action.hash == clause.accessibilityID { clause.performAction() @@ -930,7 +972,7 @@ extension Label { } open override func accessibilityActivate() -> Bool { - + guard let accessibleActions = accessibilityCustomActions else { return false } for clause in clauses { diff --git a/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeActionModel.swift b/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeActionModel.swift index 3e615cdd..f9920dcc 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeActionModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeActionModel.swift @@ -6,23 +6,39 @@ // Copyright © 2019 Verizon Wireless. All rights reserved. // -import UIKit open class LabelAttributeActionModel: LabelAttributeModel { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + override public class var identifier: String { return "action" } + var action: ActionModelProtocol - + + //-------------------------------------------------- + // MARK: - Initializer + //-------------------------------------------------- + public init(_ location: Int, _ length: Int, action: ActionModelProtocol) { self.action = action super.init(location, length) } + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + private enum CodingKeys: String, CodingKey { case action } - + + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) action = try typeContainer.decodeModel(codingKey: .action) diff --git a/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeColorModel.swift b/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeColorModel.swift index 86275d6d..b86251c3 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeColorModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeColorModel.swift @@ -6,7 +6,6 @@ // Copyright © 2019 Verizon Wireless. All rights reserved. // -import UIKit @objcMembers public class LabelAttributeColorModel: LabelAttributeModel { //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeFontModel.swift b/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeFontModel.swift index 862f8f9b..59dbac3d 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeFontModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeFontModel.swift @@ -6,8 +6,6 @@ // Copyright © 2019 Verizon Wireless. All rights reserved. // -import UIKit - @objcMembers public class LabelAttributeFontModel: LabelAttributeModel { //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeImageModel.swift b/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeImageModel.swift index 1980353c..70cd90fd 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeImageModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeImageModel.swift @@ -6,13 +6,12 @@ // Copyright © 2019 Verizon Wireless. All rights reserved. // -import UIKit class LabelAttributeImageModel: LabelAttributeModel { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- - + override public class var identifier: String { return "image" } diff --git a/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeModel.swift b/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeModel.swift index 77f7fde6..ae5f15b7 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeModel.swift @@ -6,7 +6,6 @@ // Copyright © 2019 Verizon Wireless. All rights reserved. // -import Foundation @objcMembers open class LabelAttributeModel: ModelProtocol { //-------------------------------------------------- @@ -20,7 +19,7 @@ import Foundation public static var categoryCodingKey: String { return "type" } - + public class var identifier: String { return "" } @@ -31,12 +30,16 @@ import Foundation var location: Int var length: Int - + + //-------------------------------------------------- + // MARK: - Initializer + //-------------------------------------------------- + public init(_ location: Int, _ length: Int) { self.location = location self.length = length } - + //-------------------------------------------------- // MARK: - Keys //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeStrikeThroughModel.swift b/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeStrikeThroughModel.swift index 59552e18..e84c1804 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeStrikeThroughModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeStrikeThroughModel.swift @@ -6,16 +6,28 @@ // Copyright © 2019 Verizon Wireless. All rights reserved. // -import UIKit @objcMembers public class LabelAttributeStrikeThroughModel: LabelAttributeModel { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + override public class var identifier: String { return "strikethrough" } + + //-------------------------------------------------- + // MARK: - Initializer + //-------------------------------------------------- + required public init(from decoder: Decoder) throws { try super.init(from: decoder) } + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + public override func encode(to encoder: Encoder) throws { try super.encode(to: encoder) } diff --git a/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeUnderlineModel.swift b/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeUnderlineModel.swift index d052686d..597b2491 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeUnderlineModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Label/LabelAttributeUnderlineModel.swift @@ -6,13 +6,20 @@ // Copyright © 2019 Verizon Wireless. All rights reserved. // -import UIKit @objcMembers public class LabelAttributeUnderlineModel: LabelAttributeModel { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + override public class var identifier: String { return "underline" } + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + required public init(from decoder: Decoder) throws { try super.init(from: decoder) } diff --git a/MVMCoreUI/Atomic/Atoms/Views/Label/LabelModel.swift b/MVMCoreUI/Atomic/Atoms/Views/Label/LabelModel.swift index 4ec23ad6..6b120d0c 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Label/LabelModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Label/LabelModel.swift @@ -7,8 +7,6 @@ // -import Foundation - @objcMembers public class LabelModel: MoleculeModelProtocol { //-------------------------------------------------- // MARK: - Properties