如何使 UISearchBar 的书签图标可访问?

Posted

技术标签:

【中文标题】如何使 UISearchBar 的书签图标可访问?【英文标题】:How to make a UISearchBar's bookmarks icon accessible? 【发布时间】:2013-03-22 14:44:19 【问题描述】:

我正在尝试改进应用中的旁白支持。我有一个UISearchBar。我已将showBookMarks 属性设置为YES。我已经设置了一个自定义图像:

[searchbar setImage:icon forSearchBarIcon:UISearchBarIconBookmark state:UIControlStateNormal];

我遇到的问题是,打开 Voice Over 后,无法激活书签图标。如果我输入文本,则会出现“清除”图标,并且可以按预期选择和激活它。但是一旦文本被清除并且我的书签图标出现,它就不能被选中。无论我在哪里点击,画外音矩形始终围绕整个搜索栏,包括图标。

我尝试在图标的UIImage 上设置accessibilityLabelaccessibilityTraits 属性。我已将UIImageisAccessibilityElement 属性设置为YES。似乎没有任何效果。

有谁知道需要哪些步骤才能使UISearchBar 中的书签图标可访问?

下面是搜索栏的完整代码:

UISearchBar *bar = [[UISearchBar alloc] init];
[bar sizeToFit];
bar.autoresizingMask = UIViewAutoresizingFlexibleWidth;
bar.placeholder = @"Search listed items";
bar.autocapitalizationType = UITextAutocapitalizationTypeNone;
bar.autocorrectionType = UITextAutocorrectionTypeNo;
bar.keyboardType = UIKeyboardTypeDefault;
bar.showsBookmarkButton = YES;
bar.text = @"";

UIImage *icon = [UIImage imageNamed:@"bookmarks.png"];
icon.accessibilityLabel = @"Bookmarks";
icon.accessibilityTraits = UIAccessibilityTraitButton;
icon.isAccessibilityElement = YES;
[bar setImage:icon forSearchBarIcon:UISearchBarIconBookmark state:UIControlStateNormal];
[bar setPositionAdjustment:UIOffsetMake(-1, -1) forSearchBarIcon:UISearchBarIconBookmark];

附加信息:

我应该提到搜索栏与UITableViewController 一起使用,它与UISearchDisplayController 连接。搜索栏被设置为表格视图的headerView

所有这些都是在代码中完成的。不涉及故事板或 xib。

【问题讨论】:

【参考方案1】:

经过一番调试,我找到了答案。为了让 Voice Over 识别 UISearchBar 的书签图标的自定义图标,该图标的大小必须完全正确。

使用的图像必须为 40x29 像素(Retina 版本为 80x58 像素)。 Voice Over 无法识别任何其他尺寸和图标。

我的图片是 38x31 像素(和 68x62 像素)。

我在原始问题中发布的代码都是正确的。图像大小更新后,一切都开始按预期工作。代码中唯一的变化是删除了对 setPositionAdjustment:forSearchBarIcon: 的调用,这不再需要了。

我无法想象为什么图标大小如此微小的差异会导致 Voice Over 使用自定义图标和不工作之间的差异。但它就在那里。我希望这对将来的某人有所帮助。

【讨论】:

@downvoter 请解释反对意见。我发布了我遇到的问题的确切答案。这是使 Voice Ovet 在这种情况下正常工作的未记录要求。 请说明您在哪里发现 UISearchBarIconBookmark 的大小应该是 40x29px?它是最小尺寸、最大尺寸、精确尺寸还是精确比例?我可以让它与其他一些尺寸一起使用,但我不知道哪个是推荐的。 我通过反复试验找到了它。我的原始尺寸不起作用。当我尝试指定尺寸时,它开始工作。我没有测试其他组合,所以其他一些尺寸肯定会起作用。如果您知道其他可行的尺寸,请发布它们以便其他人受益。【参考方案2】:

我已经运行了您问题中的代码,并且书签按钮似乎可以通过 VoiceOver 访问。

会不会有其他东西干扰了您的界面?任何可能在书签按钮顶部找到的不可见视图?您是否正在设置自定义清除按钮?您可以提供任何其他详细信息吗?

但是,它确实没有使用您传递的accessibilityLabel;它只是使用“按钮”,这很糟糕。我会说这可能是 UIKit 中的一个错误——你应该file a bug。

【讨论】:

谢谢。我没有提到的一件事(我很快会更新我的问题)是搜索栏正在与UITableViewControlerUISearchDisplayController 一起使用。搜索栏设置为表格视图的headerView。我想我需要创建一个新项目并一次添加一个项目,看看是什么让它停止为我工作。 好主意 - 可能是 UITAbleViewController 中的某些东西干扰了 VoiceOver。 您是否真的为搜索栏设置了自定义图标?我创建了一个简单的测试项目。如果我使用默认书签图标,则可以访问图标按钮。但是,一旦我应用了自己的自定义书签图标,就无法再访问它了。

以上是关于如何使 UISearchBar 的书签图标可访问?的主要内容,如果未能解决你的问题,请参考以下文章

将带有指定标志图标的网站书签添加到手机主屏幕

如何使网站主屏幕友好?

如何在 iOS 7 的 UISearchBar 中更改位置或隐藏放大镜图标?

XPages headTag“书签”图标 - 由于代理路由,文件不存在

使 UIActivityViewController 图标中的自定义项变得丰富多彩?

如何在 UINavigation 中显示 UISearchBar?