Latest changes to account for variable icon locations and text alignments.
This commit is contained in:
parent
7c93506d87
commit
abde89f06f
@ -20,7 +20,7 @@ public typealias ActionBlock = () -> ()
|
|||||||
public var makeWholeViewClickable = false
|
public var makeWholeViewClickable = false
|
||||||
|
|
||||||
/// Indication that attributed text attachment will affect range location of attributed text.
|
/// Indication that attributed text attachment will affect range location of attributed text.
|
||||||
fileprivate var hasAttachmentImageInsideText = false
|
public var hasAttachmentImageInsideText = false
|
||||||
|
|
||||||
/// Set this property if you want updateView to update the font based on this standard and the size passed in.
|
/// Set this property if you want updateView to update the font based on this standard and the size passed in.
|
||||||
public var standardFontSize: CGFloat = 0.0
|
public var standardFontSize: CGFloat = 0.0
|
||||||
@ -126,6 +126,7 @@ public typealias ActionBlock = () -> ()
|
|||||||
return label
|
return label
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// H32 -> Legal
|
||||||
@objc public static func commonLabelH32(_ scale: Bool) -> Label {
|
@objc public static func commonLabelH32(_ scale: Bool) -> Label {
|
||||||
let label = Label.label()
|
let label = Label.label()
|
||||||
label.styleH32(scale)
|
label.styleH32(scale)
|
||||||
@ -153,12 +154,14 @@ public typealias ActionBlock = () -> ()
|
|||||||
return label
|
return label
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// B20 -> Legal
|
||||||
@objc public static func commonLabelB20(_ scale: Bool) -> Label {
|
@objc public static func commonLabelB20(_ scale: Bool) -> Label {
|
||||||
let label = Label.label()
|
let label = Label.label()
|
||||||
label.styleB20(scale)
|
label.styleB20(scale)
|
||||||
return label
|
return label
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Default
|
||||||
@objc open class func label() -> Label {
|
@objc open class func label() -> Label {
|
||||||
return Label(frame: .zero)
|
return Label(frame: .zero)
|
||||||
}
|
}
|
||||||
@ -556,35 +559,11 @@ extension Label {
|
|||||||
|
|
||||||
@objc private func textLinkTapped(_ gesture: UITapGestureRecognizer) {
|
@objc private func textLinkTapped(_ gesture: UITapGestureRecognizer) {
|
||||||
|
|
||||||
var offset = 0
|
|
||||||
var attachmentLocations: [Int] = []
|
|
||||||
var attachmentIndex = 0
|
|
||||||
|
|
||||||
// Used to identify all image attachments in the label.
|
|
||||||
if hasAttachmentImageInsideText {
|
|
||||||
attributedText?.enumerateAttribute(.attachment, in: NSRange(location: 0, length: attributedText!.length), options: []) { value, range, stop in
|
|
||||||
guard value is NSTextAttachment else { return }
|
|
||||||
|
|
||||||
attachmentLocations.append(range.location)
|
|
||||||
if range.location == 0 {
|
|
||||||
offset = 2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for clause in clauses {
|
for clause in clauses {
|
||||||
guard let range = clause.range else { return }
|
guard let range = clause.range else { return }
|
||||||
|
|
||||||
// Must increment an offset becuase every image added to text interior increases text length by 2.
|
|
||||||
if hasAttachmentImageInsideText {
|
|
||||||
if range.location >= attachmentLocations[attachmentIndex] - range.length {
|
|
||||||
offset += 2
|
|
||||||
attachmentIndex += 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This determines if we tapped on the desired range of text.
|
// This determines if we tapped on the desired range of text.
|
||||||
if gesture.didTapAttributedTextInLabel(self, inRange: range, offset: offset) {
|
if gesture.didTapAttributedTextInLabel(self, inRange: range) {
|
||||||
clause.performAction()
|
clause.performAction()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -595,7 +574,7 @@ extension Label {
|
|||||||
// MARK: -
|
// MARK: -
|
||||||
extension UITapGestureRecognizer {
|
extension UITapGestureRecognizer {
|
||||||
|
|
||||||
func didTapAttributedTextInLabel(_ label: Label, inRange targetRange: NSRange, offset: Int) -> Bool {
|
func didTapAttributedTextInLabel(_ label: Label, inRange targetRange: NSRange) -> Bool {
|
||||||
|
|
||||||
// There would only ever be one clause to act on.
|
// There would only ever be one clause to act on.
|
||||||
if label.makeWholeViewClickable {
|
if label.makeWholeViewClickable {
|
||||||
@ -603,8 +582,14 @@ extension UITapGestureRecognizer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
guard let attributedText = label.attributedText else { return false }
|
guard let attributedText = label.attributedText else { return false }
|
||||||
|
|
||||||
|
let paragraph = NSMutableParagraphStyle()
|
||||||
|
paragraph.alignment = label.textAlignment
|
||||||
|
|
||||||
|
let newAttributedString = NSMutableAttributedString(attributedString: attributedText)
|
||||||
|
newAttributedString.addAttributes([NSAttributedString.Key.paragraphStyle: paragraph], range: NSRange(location: 0, length: attributedText.string.count))
|
||||||
|
|
||||||
let textStorage = NSTextStorage(attributedString: attributedText)
|
let textStorage = NSTextStorage(attributedString: newAttributedString)
|
||||||
let layoutManager = NSLayoutManager()
|
let layoutManager = NSLayoutManager()
|
||||||
let textContainer = NSTextContainer(size: .zero)
|
let textContainer = NSTextContainer(size: .zero)
|
||||||
|
|
||||||
@ -618,12 +603,6 @@ extension UITapGestureRecognizer {
|
|||||||
|
|
||||||
let indexOfGlyph = layoutManager.glyphIndex(for: location(in: label), in: textContainer)
|
let indexOfGlyph = layoutManager.glyphIndex(for: location(in: label), in: textContainer)
|
||||||
|
|
||||||
// If text attachment was inserted then extra indices must be accounted for.
|
|
||||||
if label.hasAttachmentImageInsideText {
|
|
||||||
let location = targetRange.location + offset
|
|
||||||
return NSLocationInRange(indexOfGlyph, NSRange(location: location, length: targetRange.length))
|
|
||||||
}
|
|
||||||
|
|
||||||
return NSLocationInRange(indexOfGlyph, targetRange)
|
return NSLocationInRange(indexOfGlyph, targetRange)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user