iOS Voiceover status

19,082

Solution 1

BOOL UIAccessibilityIsVoiceOverRunning();

Solution 2

In ViewDIdLoad

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(voiceOverStatusChanged)
                                             name:UIAccessibilityVoiceOverStatusChanged
                                           object:nil];


- (void)voiceOverStatusChanged
{
    if(!UIAccessibilityIsVoiceOverRunning())
    {
        //do your changes
    }
}

Solution 3

For Swift 4.2 and newer versions, you can check the following boolean provided by UIKit:

UIAccessibility.isVoiceOverRunning

Solution 4

As a supplement to all the previous correct answers, since iOS11 and according to this Accessibility options recap, the new notification name to be used is :

  • UIAccessibilityVoiceOverStatusDidChange (SWIFT < 4.2).
  • UIAccessibilityVoiceOverStatusDidChangeNotification (ObjC).

... while UIAccessibilityVoiceOverStatusChanged is deprecated.

EDIT for SWIFT 4.2 ==> UIAccessibility.voiceOverStatusDidChangeNotification

Share:
19,082
Arash
Author by

Arash

Principal Engineer

Updated on June 19, 2022

Comments

  • Arash
    Arash almost 2 years

    I am trying to add accessibility features to an iOS app that has already been developed.

    There are a couple of UI features (e.g. buttons) that I like them to show up if the VoiceOver option in the accessibility menu of the iPhone settings is on and do not show up if the voiceover is off.

    Is there a way to check whether the voiceover option is on or not?

  • JVM
    JVM over 5 years
    Is similar feature available for Mac?
  • David Dunham
    David Dunham over 5 years
    My Cocoa is too rusty to answer, but it looks like no. Maybe ask on the Apple developer forum.
  • Sam Soffes
    Sam Soffes over 5 years
    In Swift: UIAccessibility.isVoiceOverRunning