Generally functioning. A ways to go.

This commit is contained in:
Kevin G Christiano 2019-07-10 13:15:35 -04:00
parent f67392eb69
commit 244e3c0df3

View File

@ -40,7 +40,16 @@ public typealias ActionBlock = () -> Void
//------------------------------------------------------
public var clauses: [ActionableClause] = [] {
didSet { isUserInteractionEnabled = !clauses.isEmpty }
didSet {
isUserInteractionEnabled = !clauses.isEmpty
// Accessibility
let element = UIAccessibilityElement(accessibilityContainer: self)
element.accessibilityFrameInContainerSpace = convert(boundingRect(forCharacterRange: clauses.last!.range!), to: nil) //CGRect(x: 10, y: 10, width: 100, height: 30)
element.accessibilityLabel = "Testing"
element.accessibilityTraits = .button
accessibilityElements?.append(element)
}
}
/// Used for tappable links in the text.
@ -64,10 +73,7 @@ public typealias ActionBlock = () -> Void
lineBreakMode = .byWordWrapping
translatesAutoresizingMaskIntoConstraints = false
isAccessibilityElement = false
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(textLinkTapped(_:)))
tapGesture.numberOfTapsRequired = 1
addGestureRecognizer(tapGesture)
accessibilityElements = []
}
@objc public init() {
@ -410,6 +416,7 @@ extension Label {
originalAttributedString = nil
hasAttachmentImage = false
styleB2(true)
accessibilityElements = []
}
@objc public func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
@ -450,6 +457,7 @@ extension Label {
}
self.attributedText = mutableAttributedString
// accessibleClauses = []
clauses = []
}
@ -567,38 +575,36 @@ extension UITapGestureRecognizer {
extension Label {
override open func accessibilityActivate() -> Bool {
let point = accessibilityActivationPoint
// let point = accessibilityActivationPoint
return true
}
open override func accessibilityElementDidBecomeFocused() {
<#code#>
}
open override func accessibilityElementCount() -> Int {
return accessibleClauses.count
return accessibilityElements?.count ?? 0
}
open override func accessibilityElement(at index: Int) -> Any? {
return accessibleClauses[index]
return accessibilityElements?[index]
}
open override func index(ofAccessibilityElement element: Any) -> Int {
return accessibleClauses.firstIndex(of: element as! UIAccessibilityElement)!
return 0//accessibilityElements?.firstIndex(of: element as! UIAccessibilityElement)!
}
/*
var accessibleClauses: [UIAccessibilityElement] {
var elements = [UIAccessibilityElement]()
for clause in clauses {
let element = UIAccessibilityElement(accessibilityContainer: self)
let rect = CGRect(x: 10, y: 10, width: 100, height: 30)
element.accessibilityFrame = rect
// let rect = CGRect(x: 10, y: 10, width: 100, height: 30)
element.accessibilityFrame = convert(self.frame, to: nil)
// element.accessibilityFrame = convert(conceptualSize(range: clause.range)!, to: nil)
element.accessibilityFrameInContainerSpace = rect
// element.accessibilityFrameInContainerSpace = rect
element.accessibilityLabel = "Testing"
element.accessibilityTraits = .button
element.isAccessibilityElement = true
@ -607,4 +613,27 @@ extension Label {
accessibilityElements = elements
return elements
}
*/
func boundingRect(forCharacterRange range: NSRange) -> CGRect? {
guard let attributedText = attributedText else { return nil }
let textStorage = NSTextStorage(attributedString: attributedText)
let layoutManager = NSLayoutManager()
textStorage.addLayoutManager(layoutManager)
let textContainer = NSTextContainer(size: bounds.size)
textContainer.lineFragmentPadding = 0.0
layoutManager.addTextContainer(textContainer)
var glyphRange = NSRange()
// Convert the range for glyphs.
layoutManager.characterRange(forGlyphRange: range, actualGlyphRange: &glyphRange)
return layoutManager.boundingRect(forGlyphRange: glyphRange, in: textContainer)
}
}