2015-07-27 11 views
5

Sto tentando di fornire un'etichetta di accessibilità per UIActivityIndicatorView (che viene creata a livello di programmazione nella mia vista controller viewDidLoad). Io pongo l'etichetta di accessibilità come:Accessibilità/Voice over Requisito su UIActivityIndicatorView

myIndicatorView.accessibilityLabel = @"Please wait, processing" 

Ma quando faccio funzionare l'applicazione, il voice over legge sempre "in progress". Ho provato a eseguire il debug sul simulatore utilizzando l'ispettore di accessibilità, ma ogni volta che la vista degli indicatori è a fuoco, ha l'etichetta "in corso". Suppongo che "in corso" sia la voce predefinita sul testo per la visualizzazione degli indicatori di attività, ma non posso cambiare questa etichetta. Mi chiedo se l'etichetta dell'accessibilità della visualizzazione dell'indicatore di attività non possa mai essere modificata. Se qualcuno ha trovato questo problema e trovato una soluzione alternativa, per favore aiutatemi.

+1

In Xcode 8.1, nell'editor visuale (è ancora chiamato Interface-builder?) Non c'è una sezione "Accessibilità" per il mio UIActivityIndicatorView. (altri pulsanti, etichette e altre viste DO hanno tale sezione). È stato deciso da Apple che UIActivityIndicatorView dovesse rimanere generico, a meno che non fosse sottoclasse e sostituita dal codice? Non c'è nemmeno un'etichetta per dire "indicatore di avanzamento caricamento video" come il ruolo (mentre "pulsante" verrebbe narrato su pulsanti, ecc.). Come posso personalizzare questo? –

risposta

5

Non è che non lo stai cambiando. È che, in background, quando cambia lo stato dell'indicatore di avanzamento, il backend iOS aggiorna l'etichetta allo stato appropriato. Ciò sta ignorando qualsiasi cosa tu abbia modificato, perché è probabile che applichi il proprio aggiornamento dopo aver cambiato lo stato.

Vorrei lasciarlo solo. "Please wait, processing" non fornisce informazioni aggiuntive rispetto a "In corso". E "In corso" è il modo in cui gli utenti VoiceOver saranno abituati a sentire un indicatore di stato "In corso". Cambiare questo annuncio è per un utente non vedente, ciò che cambia l'immagine di una testa girevole di Topolino sarebbe quella avvistata.

Se si DEVE cambiare questo, ciò che si vuole fare, è invece di impostare la proprietà, sovrascrivere l'implementazione del metodo getter della proprietà. Per fare ciò fornire un'implementazione personalizzata di UIActivityIndicatorView che effettua le seguenti operazioni.

@interface MyActivityIndicator : UIActivityIndicatorView 

@end 

@implementation MYActivityIndicator 

- (NSString*)accessibilityLabel { 
    if (self.isAnimating) { 
     return NSLocalizedString("ACTIVITY_INDICATOR_ACTIVE", nil); 
    } else { 
     return NSLocalizedString("ACTIVITY_INDICATOR_INACTIVE", nil); 
    } 
} 
+0

Sono d'accordo sul lasciare l'etichetta di default –

+0

Grazie mille !!! L'unica ragione per cui ho voluto ignorare il comportamento di accessibilità per l'indicatore di attività è quello di informare la persona con disabilità se viene effettuata una chiamata di servizio. Invece di dire in corso, volevo fare qualcosa di più specifico come "i dettagli dell'account da recuperare" o qualcosa di simile "la chiamata alla lista è fatta ... per favore aspetta la risposta" (più specifico per il tipo di chiamata dell'API web) – anshul

0

UIActivityIndicatorView sottoclasse in Swift

L'attuazione del accessibilityLabel getter in UIActivityIndicatorView dinamico si basa sullo stato del controllo. Pertanto, se si imposta il suo accessibilityLabel, potrebbe cambiare in seguito.

La seguente sottoclasse UIActivityIndicatorView ha la precedenza sull'implementazione predefinita di accessibilityLabel. Essa si basa sulla risposta da @ChrisCM in Objective C.

class MyActivityIndicatorView: UIActivityIndicatorView { 

    override var accessibilityLabel: String? { 
     get { 
      if isAnimating { 
       return NSLocalizedString("ACTIVITY_INDICATOR_ACTIVE", comment: ""); 
      } 
      else { 
       return NSLocalizedString("ACTIVITY_INDICATOR_INACTIVE", comment: ""); 
      } 
     } 

     set { 
      super.accessibilityLabel = newValue 
     } 
    } 
} 

Nella mia app, l'indicatore di attività è visibile sullo schermo e per VoiceOver solo quando è animando. Pertanto, ho solo bisogno di un valore accessibilityLabel. La seguente sottoclasse utilizza l'implementazione dinamica predefinita di accessibilityLabel se non è impostata in modo esplicito. Se impostato, utilizza tale valore indipendentemente dallo stato.

class MyActivityIndicatorView: UIActivityIndicatorView { 

    private var accessibilityLabelOverride: String? 

    override var accessibilityLabel: String? { 
     get { 
      if accessibilityLabelOverride != nil { 
       return accessibilityLabelOverride 
      } 

      return super.accessibilityLabel 
     } 

     set { 
      accessibilityLabelOverride = newValue 
     } 
    } 
} 

// Example use 
let activityIndicatorView = MyActivityIndicatorView(activityIndicatorStyle: .gray) 
activityIndicatorView.accessibilityLabel = NSLocalizedString("ACTIVITY_INDICATOR", comment: "")