BottomBar BarButtonItem语音覆盖率无法访问

时间:2015-07-02 22:12:39

标签: ios objective-c accessibility uibarbuttonitem voiceover

我注意到当BarButtonItem放置在View的底栏时,标准的Voice Over行为存在一些问题。

在测试应用中,我做了以下简单视图

Test App Showing Top Bar, Bottom Bar button items and a label

使用以下代码我将更新所有3个文本元素,以便它们每秒计算一次。

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UILabel *testLabel;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *testBarButtonItem;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *testBottomBarItem;

@property (nonatomic, strong) NSTimer *timer;
@property (nonatomic) NSInteger count;

@end

@implementation ViewController

- (void)viewDidLoad
{
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.

  self.count = 0;
  self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES];

  // run the timer for the common modes so it's not interrupted with scrolling - should be ticked in pretty much all modes now
  [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

  self.testLabel.accessibilityTraits |= UIAccessibilityTraitUpdatesFrequently;
  self.testBarButtonItem.accessibilityTraits |= UIAccessibilityTraitUpdatesFrequently;
  self.testBottomBarItem.accessibilityTraits |= UIAccessibilityTraitUpdatesFrequently;
}

-(void)updateTimer:(NSTimer*)theTimer
{
  self.testLabel.text = [NSString stringWithFormat:@"Label with value %d", (int)self.count];
  self.testBarButtonItem.title = [NSString stringWithFormat:@"Top Item with title %d", (int)self.count];
  self.testBottomBarItem.title = [NSString stringWithFormat:@"Bottom Item with title %d", (int)self.count];
  self.count++;
}

在启用了Voice Over的iPhone 6+上测试此应用程序,会发生以下情况

  • 顶栏按钮项在更新其内容时会发出脉冲
  • 由于设置了UIAccessibilityTraitUpdatesFrequently trait,顶栏按钮项正确读出其更新内容
  • 由于设置了UIAccessibilityTraitUpdatesFrequently trait,中心的Label会正确读出更新的内容
  • 底栏按钮项目未正确读出其更新内容,即使它也具有UIAccessibilityTraitUpdatesFrequently trait set
  • 使用从顶部栏按钮项开始的左/右滑动导航辅助功能元素时,选择正确向下移动到带有右滑动的标签,但是从那里右滑动将选择带到视图的左上角(其中)无控制权)。然后它会读出最初的底栏按钮内容“Bottom Item With title 0”,而不管底部按钮实际读取的是什么。只有在主动选择底部条形项目时才会实际正确选择它并将其读出。但正如已经描述的那样,它不会继续阅读它

我认为导航错误在iOS 8.4中可能是新的,因为我在主应用程序中没有注意到我已经在很长一段时间内进行了语音测试,但我可能错过了它。

我在自己的应用程序中经常使用UIAccessibilityTraitUpdates并没有取得多大成功,但我看到其他应用程序似乎正在正确使用它。因此,如果有人能够指出我做错的事情那就太好了。否则我想我会记录雷达的错误。

作为参考,我现在将整个项目作为zip下载here

这里有一个关于这个bug的视频

https://youtu.be/QokQ0MDGyZM

1 个答案:

答案 0 :(得分:1)

你似乎误解了UIAccessibilityTraitUpdatesFrequently的作用。它不能确保您的内容在动态变化时被读出。它确保过度冗长的内容(如计时器)不会读出每次更新。例如,如果您将焦点放在每秒更新的计时器上。 VoiceOver会读出

1 2 3 4 ...

但是,让我们说这是一个时间。所以它必须宣读:

1小时20分55秒 1小时20分56秒 ...

但是,当它读完整个第一个公告时,#55; ... 55秒"计时器现在实际上是1:21:00。然而它仍然会读出......#56;"然后继续读出" ... 57秒"同时,计时器和实际公告越来越不同步。

如果VoiceOver未对焦,则没有任何内容会自动读取自动更新内容。这会造成严重破坏,并导致许多可访问性问题。开发人员通过适当发布以下三个辅助功能通知来通知VoiceOver动态更改:

UIAccessibilityLayoutChangedNotification
UIAccessibilityScreenChangedNotification
UIAccessibilityAnnouncementNotification

请注意,在典型的测试环境中,这些行为有点不稳定。特别是我发现,您希望在打开应用程序之前确保拥有VoiceOver。在应用程序启动时使用快速切换快捷方式是在通知系统中将VoiceOver错误输出的好方法。更好的方法是打开VoiceOver,重新启动手机,并在测试时将其保持打开状态。