画外音:每次加载视图时,ViewWillAppear 中的 UIAccessibilityLayoutChangedNotification 都没有将焦点设置在导航栏标题上

Posted

技术标签:

【中文标题】画外音:每次加载视图时,ViewWillAppear 中的 UIAccessibilityLayoutChangedNotification 都没有将焦点设置在导航栏标题上【英文标题】:Voice over : UIAccessibilityLayoutChangedNotification in ViewWillAppear is not setting focus on Navigation bar title every time the view is loaded 【发布时间】:2018-02-22 19:05:51 【问题描述】:

过去 2 天我一直在努力解决这个问题。 我有一个UITabBarController,每个选项卡在视图中都有一个UINavigationController。 当我加载标签栏控制器时,语音正在正确读取标签视图导航栏标题。它在第一次加载视图时起作用。(似乎这是默认行为。)但是当我再次选择选项卡时,画外音正在读取选项卡信息,但没有将焦点设置到导航栏标题。有没有办法在每次加载选项卡视图时将其设置为关注标题。 我尝试使用

override func viewWillAppear(_ animated: Bool) 
   super.viewWillAppear(animated)     

   UIAccessibilityPostNotification 
            (UIAccessibilityLayoutChangedNotification, self.navigationItem.titleView)

我还尝试创建一个标签作为标题视图并将其设置为NavigationItem

没有任何帮助。

非常感谢任何建议。

谢谢。

【问题讨论】:

【参考方案1】:

在 viewDidAppear 中尝试,不在 viewWillAppear 中

- (void)viewDidAppear:(BOOL)animated

    [super viewDidAppear:animated];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
        UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self.navigationItem.titleView);
    );

【讨论】:

很好,这很有效。感谢您的建议。我正在使用 swift 3,所以我不得不稍微修改一下调度。 DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(30)) UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self.navigationItem.titleView) 正如我之前提到的,您的回答对我有很大帮助,不幸的是,我没有足够的分数来支持您的回答。但它确实奏效了。任何寻找此答案的 swift 3 版本的人请查看我之前的评论。 @user2092512 你可以接受这个答案作为正确答案。

以上是关于画外音:每次加载视图时,ViewWillAppear 中的 UIAccessibilityLayoutChangedNotification 都没有将焦点设置在导航栏标题上的主要内容,如果未能解决你的问题,请参考以下文章

画外音模式 - 滚动到在滚动视图中关闭的子视图

如何防止可访问性画外音读出集合视图中选定的单元格位置?

每次加载视图时只能调用一次 layoutIfNeeded - 例如视图加载?

UIPageViewController 可访问性或画外音

从底部加载tableview,向上滚动(反向tableview)(iOS)

当我选择操作栏返回时冻结或制作稳定的 Web 视图?防止每次加载/重新加载