简体   繁体   中英

Accessibility Voice Over loses focus on Segmented SubView

I'm working on an Accessibility project where I have a segmentedController in the NavigationBar . Almost everything is working fine until the focus comes at the middle (2/3) SegmentedController . It won't speak the the accessibilityLabel..

See my code. I'm using NSNotifications to let the 'UIAccessibilityPostNotification' know when to focus:

func chatLijst() {
    let subViews = customSC.subviews
    let lijstView = subViews.last as UIView
    UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, lijstView)
}

func berichtenLijst() {
    let subViews = customSC.subviews
    let messageView = subViews[1] as UIView
    UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, messageView)
}

func contactenLijst() {
    let subViews = customSC.subviews
    let contactenView = subViews.first as UIView
    UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, contactenView)
}


func setupSegmentedController(){

    let lijst:NSString = "Lijst"
    lijst.isAccessibilityElement = false
    lijst.accessibilityLabel = "Lijst met gesprekken"

    let bericht:NSString = "Bericht"
    bericht.isAccessibilityElement = false
    bericht.accessibilityLabel = "Bericht schrijven"

    let contacten:NSString = "Contacten"
    contacten.isAccessibilityElement = false
    contacten.accessibilityLabel = "Contacten opzoeken"

    let midden:CGFloat = (self.view.frame.size.width - 233) / 2
    customSC.frame = CGRectMake(midden, 7, 233, 30)
    customSC.insertSegmentWithTitle(lijst, atIndex: 0, animated: true)
    customSC.insertSegmentWithTitle(bericht, atIndex: 1, animated: true)
    customSC.insertSegmentWithTitle(contacten, atIndex: 2, animated: true)
    customSC.selectedSegmentIndex = 0
    customSC.tintColor = UIColor.yellowColor()
    customSC.isAccessibilityElement = true

    self.navigationController?.navigationBar.addSubview(customSC)
}

Fix

Strange enough I had to restructure the subViews array in the setup func and replace UIAccessibilityPostNotification object with the new segmentsView array.

func chatLijst() {
    UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, segmentsViews[0])
}

     // Restructure subviews....
    segmentsViews = [customSC.subviews[2], customSC.subviews[1], customSC.subviews[0]]

I'm using NSNotifications to let the 'UIAccessibilityPostNotification' know when to focus

Don't . That's a poor way to build a custom accessible control, and more importantly it can be confusing to the user. The screen changed notification doesn't just change focus, it also plays a specific sound that indicates to the user that the contents of the screen has changed.

Instead, I would recommend that you either make the subviews that you want appear as accessibility elements be accessibility elements with their own labels and traits and then rely on the OS to focus and activate them, or that you implement the UIAccessibilityContainer protocol in your custom control and then rely on the OS to focus and activate them.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM