Как сделать значок закладок UISearchBar доступным?

Я пытаюсь улучшить поддержку Voice Over в приложении. У меня есть UISearchBar. Я установил для свойства showBookMarks значение YES. И я установил собственное изображение с помощью:

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

У меня проблема в том, что при включенном Voice Over нет возможности активировать значок закладок. Если я ввожу текст, появляется значок «очистить», и его можно выбрать и активировать, как и ожидалось. Но как только текст очищается и появляется значок моих закладок, его нельзя выбрать. Независимо от того, где я нажимаю, прямоугольник Voice Over всегда окружает всю панель поиска, включая значки.

Я попытался установить свойства accessibilityLabel и accessibilityTraits в UIImage для значка. Я установил для свойства isAccessibilityElement UIImage значение 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 не задействованы.


person rmaddy    schedule 22.03.2013    source источник


Ответы (2)


После кучи отладки я нашел ответ. Чтобы Voice Over распознал пользовательский значок для значка закладок UISearchBar, он должен быть точно правильного размера.

Используемые изображения должны иметь размер 40x29px (80x58px для версии для сетчатки). Любой другой размер и значки не распознаются Voice Over.

Мои изображения были 38x31px (и 68x62px).

Код, который я разместил в своем исходном вопросе, верен. Как только изображения были обновлены в размере, все заработало как положено. Единственным изменением в коде было удаление вызова setPositionAdjustment:forSearchBarIcon:, который больше не нужен.

Я не могу представить, почему такая крошечная разница в размере значков может быть разницей между работой Voice Over с пользовательскими значками и неработающей. Но вот оно. Я надеюсь, что это поможет кому-то в будущем.

person rmaddy    schedule 22.03.2013
comment
@downvoter, пожалуйста, объясните отрицательный голос. Я разместил точный ответ на проблему, которая у меня была. Это недокументированное требование для корректной работы Voice Ovet в данном случае. - person rmaddy; 23.03.2013
comment
Пожалуйста, объясните, где вы нашли, что размер UISearchBarIconBookmark должен быть 40x29px? Это минимальный размер, максимальный размер, точный размер или точное соотношение? Мне удалось заставить его работать с некоторыми другими размерами, но я не знаю, какой из них рекомендуется. - person Cœur; 21.08.2013
comment
Я нашел его методом проб и ошибок. Мой оригинальный размер не подошел. Когда я попробовал указанный размер, он начал работать. Я не тестировал другие комбинации, так что вполне возможно, что другие размеры будут работать. Если вы знаете о других размерах, которые работают, пожалуйста, опубликуйте их, чтобы другие могли воспользоваться. - person rmaddy; 21.08.2013

Я запустил код в вашем вопросе, и кажется, что кнопка закладок доступна через VoiceOver.

введите здесь описание изображения

Может ли быть что-то еще, что мешает вашему интерфейсу? Любые невидимые представления, которые могут найти свой путь поверх кнопки закладок? Вы устанавливаете пользовательскую кнопку очистки? Любые другие детали, которые вы можете предоставить?

Однако это правда, что он не использует accessibilityLabel, который вы ему передаете; он просто использует «Кнопку», что отстой. Я бы сказал, что это, вероятно, ошибка в UIKit — вы должны заявить об ошибке.

person Ash Furrow    schedule 22.03.2013
comment
Спасибо. Одна вещь, которую я забыл упомянуть (и я вскоре обновлю свой вопрос), заключается в том, что панель поиска используется с UITableViewControler и UISearchDisplayController. Панель поиска устанавливается как headerView табличного представления. Я предполагаю, что мне нужно создать новый проект и добавлять части по одному и смотреть, что заставляет его перестать работать для меня. - person rmaddy; 22.03.2013
comment
Хорошая идея — может быть что-то в UITAbleViewController мешает работе VoiceOver. - person Ash Furrow; 22.03.2013
comment
Вы на самом деле установили собственный значок для панели поиска? Я создал простой тестовый проект. Если я использую значок закладок по умолчанию, кнопка значка доступна. Но как только я применяю свой собственный значок закладок, он больше не доступен. - person rmaddy; 23.03.2013