如何使UITextView中的属性字符串可访问?

时间:2017-03-30 15:06:04

标签: ios swift accessibility voiceover

默认情况下,屏幕阅读器将选择整个视图,双击时无法跟踪链接。实际上,在辅助功能检查器上按下激活会导致应用程序委托崩溃而控制台中没有任何堆栈跟踪。我试过搞乱UITextView本身的可访问性特征,但我没有运气。

let quoteAttributedStr = NSMutableAttributedString(string: "This is a test String" + " ")
                let enableLinkText = NSAttributedString(string: "this is the clickable text", attributes: dummyLinkAttribute)
                quoteAttributedStr.append(enableLinkText)

                return quoteAttributedStr

Example TextView

2 个答案:

答案 0 :(得分:0)

要使NSMutableAttributedString的一部分可选,您需要将其设置为如此链接:

quoteAttributedStr.setAsLink("string that you wish to be selectable goes here", linkURL: "url")

您还需要添加UITextViewDelegate,并添加:

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
}

处理它。

这是我忘记包含的setAsLink的扩展名:

extension NSMutableAttributedString {

public func setAsLink(_ textToFind:String, linkURL:String) -> Bool {

    let foundRange = self.mutableString.range(of: textToFind)
    if foundRange.location != NSNotFound {
        self.addAttribute(NSLinkAttributeName, value: linkURL, range: foundRange)
        return true
    }
    return false
}
}

答案 1 :(得分:0)

该问题涉及必须在UITextView中激活链接时使用的specific VoiceOver gesture

我创建了一个空白项目(iOS 12,Xcode 10),其中包含以下代码段,以在myTextView元素中获得2个URL:

class TextViewURLViewController: UIViewController, UITextViewDelegate {

    @IBOutlet weak var myTextView: UITextView!

    let myString = "Follow this developers guide if you already know the VoiceOver gestures."
    let myDevURL = "https://a11y-guidelines.orange.com/mobile_EN/dev-ios.html"
    let myGesturesURL = "https://a11y-guidelines.orange.com/mobile_EN/voiceover.html"


    override func viewDidLoad() {

        let attributedString = NSMutableAttributedString(string: myString)

        attributedString.addAttribute(.link,
                                      value: myDevURL,
                                      range: NSRange(location: 12,
                                                     length: 17))

        attributedString.addAttribute(.link,
                                      value: myGesturesURL,
                                      range: NSRange(location: 52,
                                                     length: 19))

        myTextView.attributedText = attributedString
        myTextView.font = UIFont(name: myTextView.font!.fontName,
                                 size: 25.0)
    }


    func textView(_ textView: UITextView,
                  shouldInteractWith URL: URL,
                  in characterRange: NSRange,
                  interaction: UITextItemInteraction) -> Bool {

        UIApplication.shared.open(URL, options: [:])
        return false
    }
}

按照下面的步骤激活链接:

  1. 以适当的手势获取转子links项目。
  2. 用一根手指向上或向下滑动以访问链接。
  3. 双击并按住,直到您看到第4步上的屏幕

description of the first three steps

  1. 链接上方会显示一种弹出窗口。
  2. 一旦出现操作表,请向右轻拂以执行Open操作。
  3. 双击以打开URL并获得步骤7的最后一个屏幕。

description of the last three steps

按照上面的代码片段,您可以使UITextView中的属性字符串可访问,然后双击并按住以打开它,直到弹出窗口出现在链接上方。