2013-03-22 7 views
9

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

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

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

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

И все это делается в коде. Нет раскадровки или xibs.

ответ

4

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

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

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

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

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

+0

@ downvoter, пожалуйста, объясните нижний план. Я отправил точный ответ на проблему, которая у меня была. Это недокументированное требование для правильной работы Voice Ovet для этого случая. – rmaddy

+0

Пожалуйста, объясните, где вы обнаружили, что размер UISearchBarIconBookmark должен быть 40x29px? Это минимальный размер, максимальный размер, точный размер или точное соотношение? Я смог заставить его работать с некоторыми другими размерами, но я не знаю, какой из них рекомендуется. –

+0

Я нашел его методом проб и ошибок. Мой первоначальный размер не работал. Когда я попробовал указанный размер, он начал работать. Я не тестировал другие комбинации, поэтому, возможно, будут работать некоторые другие размеры. Если вы знаете о других размерах, которые работают, пожалуйста, разместите их, чтобы другие могли воспользоваться. – rmaddy

1

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

enter image description here

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

Однако, это правда, что он не использует accessibilityLabel, что вы его передаете; он просто использует «Button», что отстой. Я бы сказал, что это, вероятно, ошибка в UIKit - вы должны file a bug.

+1

Спасибо. Одна вещь, которую я забыл упомянуть (и я скоро обновлю свой вопрос), заключается в том, что панель поиска используется с 'UITableViewControler' и' UISearchDisplayController'. Строка поиска задается как 'headerView' табличного представления. Думаю, мне нужно создать новый проект и добавить штуки по одному и посмотреть, что заставляет его перестать работать на меня. – rmaddy

+0

Хорошая идея - может быть что-то в 'UITAbleViewController', которая мешает VoiceOver. –

+0

Действительно ли вы установили пользовательский значок для панели поиска? Я создал простой тестовый проект. Если я использую значок закладки по умолчанию, доступна кнопка значка. Но как только я применил свой собственный значок закладки, он больше не доступен. – rmaddy