iOS刷新辅助功能标签

时间:2017-08-23 07:08:33

标签: ios objective-c accessibility voiceover

我有一个带辅助功能标签@"a"的按钮。按下按钮后,我有一个设置可访问性标签button.accessibilityLabel = @"b"的回调。我知道这行代码运行。但是,如果我再次点击该按钮,VoiceOver仍然会读取。不幸的是,我正在使用的代码是专有的,所以我不能直接分享它。

但是,一般情况下,我想知道哪些问题可能导致VoiceOver无法识别标签的更新。

4 个答案:

答案 0 :(得分:3)

处理动态可访问性标签的最佳方法是覆盖正在聚焦的视图上的属性函数(EX:在UIButton上)。这允许两件事。答:维护起来要比在任何地方设置属性都要容易。 B:您可以记录信息并查看系统何时请求该信息,以便您可以更好地了解为什么会发生这种情况。因此,即使它没有直接解决您的问题,查看系统何时请求您的值并记录该数据本身也很有价值。

  

在Objective C中执行此操作

@implementation YourUIButton

-(NSString*)accessibilityLabel {
    if(someCondition) {
        return @"a";
    } else {
        return @"b";
    }
}

@end
  

在Swift中

public class YourUIButton : UIButton
    override public var accessibilityLabel: String? {
        get {
            if (someCondition) {
                return "a"
            } else {
                return "b"
            }
        }

        set {
            NSException.raise(NSException("AccessibilityLabelException", "You should not set this accessibility label.", blah))
        }
    }
}

您也可以使用此逻辑进行调试,并允许设置等。

这里有很多潜在的问题。竞争条件,其中视图实际上正在获得焦点,是否存在一些父子关系等。覆盖属性并将记录语句添加到上面的代码将帮助您了解实际获取所请求的可访问性标签的视图以及何时。超有价值的信息!

答案 1 :(得分:1)

尝试将UIAccessibilityTraitUpdatesFrequently添加到按钮属性accessibilityTraits

- (void)viewDidLoad {
    myButton.accessibilityTraits |= UIAccessibilityTraitUpdatesFrequently
}

此外,在更改accessibilityLabel时,请确保您在主线程上。

dispatch_async(dispatch_get_main_queue(), ^{
    myButton.accessibilityLabel = @"b";
});

答案 2 :(得分:0)

在更改按钮文字时使用它

UIAccessibility.post(notification: .layoutChanged, argument: yourButton)

答案 3 :(得分:-3)

你真的不需要一种刷新语音标签的方法。它自动完成。我试过这个,它按预期工作。

class ViewController: UIViewController {

    var tapCount = 0

    var button: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        button = UIButton(type: .system)
        button.setTitle("Hello", for: .normal)
        button.frame = CGRect(x: 10, y: 10, width: 100, height: 50)
        view.addSubview(button)

        button.accessibilityLabel = "Hello Button"
        button.accessibilityHint = "Tap here to start the action"
        button.accessibilityIdentifier = "hello_button"
        button.addTarget(self, action: #selector(buttonTap(sender:)), for: .touchUpInside)
    }

    @IBAction func buttonTap(sender:UIButton) {
        tapCount = tapCount + 1
        sender.accessibilityLabel = "Hello button, tapped \(tapCount) times"
    }
}

什么声音超越:

Hello Button - 暂停 - 按钮 - 暂停 - 点按此处开始操作

点击按钮

Hello按钮,点击一次

另一个点击

Hello按钮,点击两次