2013-03-22 15 views
9

Próbuję poprawić obsługę Voice Over w aplikacji. Mam UISearchBar. Ustawiłem właściwość showBookMarks na YES. A ja ustawić niestandardowy obraz z:Jak udostępnić ikonę zakładki UISearchBar?

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

Problem mam to, że z biegiem głosowe włączone, nie ma sposobu, aby aktywować ikonę zakładek. Jeśli wprowadzę tekst, pojawi się ikona "wyczyść", którą można wybrać i aktywować zgodnie z oczekiwaniami. Ale po usunięciu tekstu i wyświetleniu ikony zakładek nie można jej wybrać. Bez względu na to, gdzie dotknę, prostokąt Voice Over zawsze otacza cały pasek wyszukiwania, w tym ikony.

Próbowałem ustawić dla accessibilityLabel i accessibilityTraits właściwości na UIImage dla ikony. Ustawiłem właściwość UIImage dla na YES. Nic nie działa.

Czy ktoś wie, jakie kroki są wymagane, aby ikona zakładek w UISearchBar była dostępna?

Oto kompletny kod do paska wyszukiwania:

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]; 

Informacje dodatkowe:

należy wspomnieć, że pasek wyszukiwania jest używany z UITableViewController, która jest połączona z UISearchDisplayController. Pasek wyszukiwania jest ustawiany jako widok tabeli headerView.

Wszystko to odbywa się w kodzie. Żadne storyboardy ani Xibs nie są zaangażowane.

Odpowiedz

4

Po kilku debugowaniu znalazłem odpowiedź. Aby Voice Over rozpoznawał niestandardową ikonę ikony zakładek UISearchBar, ikona musi mieć dokładnie prawidłowy rozmiar.

Używane obrazy muszą mieć rozmiar 40 x 29 pikseli (80 x 58 pikseli dla wersji siatkówki). Każdy inny rozmiar i ikony nie zostaną rozpoznane przez Voice Over.

Moje obrazy miały wymiary 38 x 31 pikseli (i 68 x 62 piksele).

Kod, który napisałem na moje oryginalne pytanie jest poprawny. Po zaktualizowaniu obrazów wszystko zaczęło działać zgodnie z oczekiwaniami. Jedyną zmianą w kodzie było usunięcie wywołania do setPositionAdjustment:forSearchBarIcon:, które nie było już potrzebne.

Nie mogę sobie wyobrazić, dlaczego tak mała różnica w wielkości ikon będzie różnicą między Voice Over a niestandardowymi ikonami i nie działa. Ale tak jest. Mam nadzieję, że to pomoże komuś w przyszłości.

+0

@downvoter proszę wyjaśnić. Wysłałem dokładną odpowiedź na problem, który miałem. Jest to nieudokumentowany wymóg, aby Voice Ovet działał prawidłowo w tym przypadku. – rmaddy

+0

Proszę wyjaśnić, gdzie stwierdzono, że rozmiar UISearchBarIconBookmark powinien wynosić 40x29px? Czy jest to minimalny rozmiar, maksymalny rozmiar, dokładny rozmiar lub dokładny stosunek? Udało mi się sprawić, by działał z innymi rozmiarami, ale nie wiem, który z nich jest zalecany. –

+0

Znalazłem go metodą prób i błędów. Mój oryginalny rozmiar nie działał. Kiedy próbowałem określonego rozmiaru, zaczęło działać. Nie testowałem innych kombinacji, więc z pewnością możliwe będą inne rozmiary. Jeśli znasz inne rozmiary, które działają, opublikuj je, aby inni mogli skorzystać. – rmaddy

1

Uruchomiłem kod w pytaniu, a przycisk zakładek jest dostępny za pośrednictwem VoiceOver.

enter image description here

Czy może być coś innego, że jest zakłócanie interfejsu? Wszelkie niewidoczne widoki, które mogą znaleźć się na górze przycisku zakładek? Czy ustawiasz przycisk czyszczenia niestandardowego? Jakieś inne szczegóły, które możesz podać?

Jednak to prawda, że ​​nie używasz accessibilityLabel, że je przekazujesz; po prostu używa "Button", który jest do bani. Powiedziałbym, że to prawdopodobnie błąd w UIKit - powinieneś file a bug.

+1

Dzięki. Jedną rzeczą, o której zapomniałem wspomnieć (a niedługo zaktualizuję moje pytanie) jest to, że pasek wyszukiwania jest używany z 'UITableViewControler' i' UISearchDisplayController'. Pasek wyszukiwania jest ustawiony jako 'headerView' widoku tabeli. Sądzę, że muszę stworzyć nowy projekt i dodawać elementy po jednym na raz i zobaczyć, co sprawia, że ​​przestają one działać. – rmaddy

+0

Dobry pomysł - może być czymś w 'UITAbleViewController', który zakłóca działanie VoiceOver. –

+0

Czy rzeczywiście ustawiłeś niestandardową ikonę paska wyszukiwania? Stworzyłem prosty projekt testowy. Jeśli używam domyślnej ikony zakładek, przycisk z ikoną jest dostępny. Ale gdy tylko zastosuję własną ikonę zakładek, nie będzie ona już dostępna. – rmaddy