2013-03-22 12 views
9

Sto provando a migliorare il supporto Voice Over in un'app. Ho un UISearchBar. Ho impostato la proprietà showBookMarks su YES. E ho messo un'immagine personalizzata con:Come rendere accessibile l'icona dei segnalibri di UISearchBar?

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

Il problema che ho è che con Voice Over acceso, non v'è alcun modo per attivare l'icona Segnalibri. Se inserisco il testo, viene visualizzata l'icona "Cancella" che può essere selezionata e attivata come previsto. Ma una volta che il testo è stato cancellato e l'icona dei miei segnalibri appare, non può essere selezionata. Indipendentemente da dove tocchi, il rettangolo Voice Over circonda sempre l'intera barra di ricerca, incluse le icone.

Ho provato a impostare le proprietà accessibilityLabel e accessibilityTraits su UIImage per l'icona. Ho impostato la proprietà isAccessibilityElement di UIImage su YES. Niente sembra funzionare.

Qualcuno sa quali passaggi sono necessari per rendere l'icona dei segnalibri in un UISearchBar accessibile?

Ecco il codice completo per la barra di ricerca:

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

Informazione supplementare:

Devo dire che la barra di ricerca viene utilizzato con un UITableViewController che è collegata con un UISearchDisplayController. La barra di ricerca viene impostata come headerView nella vista tabella.

E tutto questo è fatto nel codice. Non sono coinvolti storyboard o xibs.

risposta

4

Dopo una serie di debug, ho trovato la risposta. Affinché Voice Over riconosca un'icona personalizzata per l'icona dei segnalibri di un UISearchBar, l'icona deve essere della dimensione corretta.

Le immagini utilizzate devono essere 40x29px (80x58px per la versione retina). Qualsiasi altra dimensione e le icone non vengono riconosciute da Voice Over.

Le mie immagini erano 38x31px (e 68x62px).

Il codice che ho inserito nella mia domanda originale è tutto corretto. Una volta che le immagini sono state aggiornate in dimensioni, tutto ha iniziato a funzionare come previsto. L'unico cambiamento nel codice era la rimozione della chiamata a setPositionAdjustment:forSearchBarIcon: che non era più necessaria.

Non riesco a immaginare perché una così piccola differenza nella dimensione dell'icona sarebbe la differenza tra Voice Over che funziona con icone personalizzate e non funziona. Ma eccolo. Spero che questo aiuti qualcuno in futuro.

+0

@downvoter si prega di spiegare il downvote. Ho pubblicato la risposta esatta al problema che avevo. Questo è un requisito non documentato per far sì che Voice Ovet funzioni correttamente per questo caso. – rmaddy

+0

Per favore, spiega dove hai trovato che la dimensione di UISearchBarIconBookmark deve essere 40x29px? È una dimensione minima, una dimensione massima, una dimensione esatta o un rapporto esatto? Sono riuscito a farlo funzionare con altre dimensioni, ma non so quale sia quello raccomandato. –

+0

L'ho trovato per tentativi ed errori. La mia dimensione originale non ha funzionato. Quando ho provato la dimensione specificata, ha iniziato a funzionare. Non ho testato altre combinazioni quindi è sicuramente possibile che altre dimensioni funzionino. Se sei a conoscenza di altre taglie che funzionano, per favore pubblicale in modo che gli altri possano trarne beneficio. – rmaddy

1

Ho eseguito il codice nella domanda e il pulsante dei segnalibri sembra essere accessibile tramite VoiceOver.

enter image description here

Potrebbe esserci qualcos'altro che sta interferendo con l'interfaccia? Qualsiasi vista invisibile che potrebbe trovarsi sulla parte superiore del pulsante dei segnalibri? Stai impostando un pulsante di cancellazione personalizzato? Altri dettagli che puoi fornire?

Tuttavia, è vero che non sta utilizzando lo accessibilityLabel che lo stai trasmettendo; usa solo "Button", che fa schifo. Direi che probabilmente è un bug in UIKit - dovresti file a bug.

+1

Grazie. Una cosa che ho dimenticato di menzionare (e aggiornerò la mia domanda a breve) è che la barra di ricerca viene utilizzata con un 'UITableViewControler' e un' UISearchDisplayController'. La barra di ricerca è impostata come 'headerView' della vista tabella. Credo di aver bisogno di creare un nuovo progetto e aggiungere pezzi uno alla volta e vedere cosa lo fa smettere di funzionare per me. – rmaddy

+0

Buona idea - potrebbe essere qualcosa nel 'UITAbleViewController' che interferisce con VoiceOver. –

+0

Hai effettivamente impostato un'icona personalizzata per la barra di ricerca? Ho creato un semplice progetto di test. Se utilizzo l'icona dei segnalibri di default, il pulsante icona è accessibile. Ma non appena apro la mia icona personalizzata dei segnalibri, non è più accessibile. – rmaddy