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

rma*_*ddy 9 objective-c uisearchbar ios voiceover uiaccessibility

我正在尝试在应用中改善Voice Over支持.我有一个UISearchBar.我把showBookMarks财产设置为YES.我已经设置了一个自定义图像:

[searchbar setImage:icon forSearchBarIcon:UISearchBarIconBookmark state:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)

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

我已经尝试在图标上设置accessibilityLabelaccessibilityTraits属性UIImage.我已经设置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];
Run Code Online (Sandbox Code Playgroud)

附加信息:

我应该提一下,搜索栏与a UITableViewController连接使用UISearchDisplayController.搜索栏被设置为表格视图headerView.

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

rma*_*ddy 5

经过一堆调试后,我找到了答案.为了使Voice Over能够识别a的书签图标的自定义图标UISearchBar,该图标必须具有正确的大小.

使用的图像必须是40x29px(视网膜版本为80x58px).Voice Over无法识别任何其他尺寸和图标.

我的图像是38x31px(和68x62px).

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

我无法想象为什么图标大小的这么小的差异将是Voice Over使用自定义图标和不工作之间的区别.但它确实如此.我希望这可以帮助将来的某个人.