- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在使用 VoiceOver 时遇到了一个奇怪的问题。
目标:
UILabel
的 UIStackView
作为我的 navigationItem.titleView
。accessibilityLabel
设置为适当的值。viewDidAppear(animated:)
中调用 UIAccessibility.post(notification: .screenChanged, argument: navigationItem.titleView)
将堆栈 View 设置为初始 VoiceOver 焦点。 预期结果:
实际结果:
如果我将 navigationItem.titleView
设置为 UILabel
的实例,则不会发生此问题。
有人知道为什么会这样吗?这是 iOS 中的错误吗?
我在这里建立了一个简单的项目来演示这个问题: https://github.com/rzulkoski/Focus-TitleView-Bug
最佳答案
你的标题有二次阅读的原因在你的代码中。
在您的 viewDidLoad
中,您设置了 VoiceOver 自动读出的堆栈 View 可访问性标签,以通知用户更改。
接下来,您通过 viewDidAppear
中的帖子通知此更改,VoiceOver 自然也会读出。
要防止这种行为,只需删除 setupNavigationItem
函数中的 stackView.accessibilityLabel = label.text
并将此代码段添加到您的私有(private)惰性变量标签 init 中:
if (self.view.subviews.contains(stackView)) {
stackView.accessibilityLabel = label.text
}
以这种方式更新 stackView.accessibilityLabel
不会触发 VoiceOver 来通知用户并允许实现您的目的。
但是,我不建议将标题读出作为新页面的第一个元素,除非你 reorder呈现的元素。
VoiceOver 用户自然不会猜到标题前有另一个元素:
从技术上讲,您的问题已通过上面的代码解决,但从概念上讲,如果您仍想将标题显示为第一个元素,我建议您对元素重新排序。
==========
编辑(解决方法)
关于技术问题,您的评论是正确的,由于 VoiceOver 的标签阅读,上述解决方案有效。
我在您在初始帖子中提供的 git 分支中提交了一个解决方案。
问题涉及 UIStackView,在这种情况下我无法解释,也无法按原样解决。
为了达到您的目的,我为 stackview 创建了一个 UIAccessibilityELement
,它可以完美地访问和公开,无需通过后通知进行双重读取。
我这样做是因为当标签位于时我无法以编程方式获得 stackview 的新大小...也许创建一个 UIStackView 子类并进入其 layoutSubviews
可能是诀窍?
此解决方案应该作为变通方法但我不知道此行为出现在 UIStackview 中的原因。
==========
编辑(解决方案)
问题在于 navigationItem
的 titleView
的创建方式。实现目标的最佳方式是:
UIView
,其框架与 stackview 的框架相同。在您的代码中执行以下步骤:
在 stackview 属性中添加 .header
特征:
private lazy var stackView: UIStackView = {
let stackView = UIStackView(frame: .zero)
stackView.axis = .vertical
stackView.alignment = .center
stackView.distribution = .equalSpacing
stackView.isAccessibilityElement = true
stackView.accessibilityTraits = .header
return stackView
}()
如下更改“switch...case...”代码部分中的 stackview case:
case .stackView:
label.text = "UIStackView"
label.sizeToFit()
stackView.addArrangedSubview(label)
label2.text = subtitle
label2.sizeToFit()
stackView.addArrangedSubview(label2)
stackView.frame.size.width = max(label.frame.width, label2.frame.width)
stackView.frame.size.height = label.frame.height + label2.frame.height
stackView.accessibilityLabel = label.text?.appending(", \(label2.text!)")
navigationItem.titleView = UIView(frame: stackView.frame)
navigationItem.titleView?.addSubview(stackView)
}
现在,postNotification
只读出一次堆栈 View 作为屏幕的第一个元素。
关于ios - 聚焦非 UILabel titleView 时,VoiceOver 会读取辅助功能标签两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54954861/
我已经在我的 navigation.titleView 中添加了一个搜索栏 self.navigationItem.titleView = searchBar 还有一个带有 title = "
我正在尝试使用以下代码在 UINavigationItem 上添加我的图像: override func viewDidLoad() { super.viewDidLoad()
Xamarin 新手,我正在尝试在我的跨平台应用程序中创建自定义导航栏。经过一些阅读,我发现我可以在我的 xaml 页面文件中使用标题 View 组件,如下所示。
我正在使用带有自定义 UIView 子类的导航,该子类成为我的 titleView。我想确保这是完整的可用宽度。 从我的 UIViewController 的 viewWillAppear: 逻辑上来
我发现有关使用 UINavigationItem#titleView 和自定义字体的信息很少。当我这样做时,导航栏中的字体垂直不对齐。 这篇文章的部分目的是记录黑客行为,也希望有人对这个问题有一个简洁
我正在尝试添加自定义控件作为 UINavigationBar 中的 titleView。当我这样做时,尽管设置了通常采用全宽的框架和属性,但我得到了: 亮蓝色可以忽略,因为它是我隐藏自定义控件的地方。
我正在尝试动态设置导航栏的文本,以便标题文本始终适合。我是这样完成的: // Pet's Day text "Joy's Day" if let range = currentPet.range(of
我想使用 UITextField 创建一个搜索栏。我尝试将 NavigationItem 的 TitleView 设置为文本字段并设置相应的约束。但导航栏中央的文本字段仍然很短。如何让文本框填满整个导
我正在学习一个 coursera 类(class),我真的到了我认为我不适合这个工作领域(开发)并且应该坚持图形设计的地步。至少我想完成这门类(class),但我不断收到我不明白的错误!根据 logc
我想在第一个 View Controller 的导航栏中添加一个 Logo ,但它的缩放效果很差,因为我不知道最大尺寸是多少。有谁知道吗? 顺便说一句,我知道创建全尺寸图像的技巧,但我不想这样做,我只
当方向改变时调整 UINavigationBar titleview 内容图像大小的最佳方法是什么。我有一张图像高度为 44 像素,另一张图像高度为 32 像素,在旋转 View 后,我更改标题 Vi
在自定义类 MMTimerButton 中,我将按钮设置为响应单击和双击 - (id)initWithFrame:(CGRect)frame { self = [super initWithF
我正在使用 Storyboard ,并将 UIView 添加到带有 2 个子 UILabels 的导航项。我希望 UIView 尽可能达到最大宽度。我注意到我无法使用自动布局来创建约束来执行此操作。这
我的目标是在导航 Controller 页面标题中使用不同字体大小的标题和副标题(标题应该更大,副标题应该相应地更低)。 我找到了实现此功能的代码示例。唯一的问题是未应用字体大小——标题和副标题的字体
我的应用程序适合放在 UINavigationController 中。简单地说,我将 MyUIViewController 设置为 navigationController 的 rootViewCo
我正在尝试推送一个 View Controller 并设置其导航栏的标题,但我猜是因为使用了很长的标题,所以它没有居中。与此同时,后退按钮的范围增加到标题 View ,即如果我点击 Milestone
我想用图像和文本设置 navigationItem 的 titleView,如下图所示: 我该如何实现? 更具体地说,我正在尝试在 Swift 中执行此操作。 最佳答案 条件,你的 Controlle
我有这样的东西: 但我需要为 titleView 设置的 View 在左侧和右侧没有这些边距。像这样: 这就是我实际做的: @property (nonatomic, strong) XHScroll
我在 UIViewController 扩展中使用这个函数来添加一个调整字体以适应宽度的标题。 extesion UIViewController { func setTitleDiffere
在我的 View Controller 中,我将 titleView 设置为 UIView,其中包含一个 UIImageView,使用 setCornerRadius 将其制成一个圆圈层。 圆的上半部
我是一名优秀的程序员,十分优秀!