UIBarButtonItem 是否不再支持 iOS14 中的 accessibilityLabel?

Is UIBarButtonItem no longer supporting accessibilityLabel in iOS 14?

更新: 此错误已在 iOS 14.5

中修复

我在 UINavigationController 中嵌入了以下 class:

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let barButton = UIBarButtonItem(title: "Save", style: .plain, target: nil, action: nil)
        barButton.accessibilityLabel = "Save meeting"
        navigationItem.rightBarButtonItem = barButton
    }
}

运行 iOS 14.4 时,可访问性标签将被忽略,VoiceOver 仅宣布可见的标题。但是,在 iOS 13.7 上,可访问性标签被正确使用。 UIBarButtonItem 的用法是否已更改或者这是一个 iOS 错误?

上下文截图:

将 UIBarButtonItem 的可访问性设置为 true。

    let barButton = UIBarButtonItem(title: "Save", style: .plain, target: nil, action: nil)
    barButton.accessibilityLabel = "Save meeting"
    barButton.isAccessibilityElement = true
    navigationItem.rightBarButtonItem = barButton

当我必须实现 UIBarButtonItem 时,我总是遵循 these instructions 以确保 a11y 稳定且功能齐全。

我不知道这种情况是错误还是由于新的 iOS 版本导致的一种回归,但在导航栏按钮中实现 a11y 作为自定义是避免不幸意外的完美方式即使它看起来像样板解决方案。

我创建了一个空白项目,其中在导航控制器中嵌入了一个简单的视图控制器,其中右栏按钮显示如下:

class NavBarViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    
        var a11yRightBarButton: UIBarButtonItem?
    
        let a11y = UILabel()
        a11y.text = "OK"
        a11y.sizeToFit()
        a11y.isUserInteractionEnabled = true //Mandatory to use the 'tap gesture'.
    
        a11yRightBarButton = UIBarButtonItem(customView: a11y)
    
        let tap = UITapGestureRecognizer(target: self,
                                         action: #selector(validateActions(info:)))
        a11yRightBarButton?.customView?.addGestureRecognizer(tap)
    
        a11yRightBarButton?.isAccessibilityElement = true
        a11yRightBarButton?.accessibilityTraits = .button
        a11yRightBarButton?.accessibilityLabel = "validate your actions"
    
        navigationItem.rightBarButtonItem = a11yRightBarButton
    }

    @objc func validateActions(info: Bool) -> Bool {
        print("hello")
        return true
    }
}

您的右栏按钮显示 “确定” 并且 VoiceOver 读出 “验证您的操作” 在 iOS 14.4 和Xcode 12.4。

根据这个原理,您可以使用 UIBarButtonItem 作为支持 iOS 14 中的可访问性标签 属性。