2009-09-17 13 views
9

Desidero disattivare i fastidiosi clic generati da UIPickerView durante lo scorrimento verso l'alto e verso il basso. C'è un modo per fare questo? Voglio suonare suoni corti per ogni oggetto su cui si basa la vista del raccoglitore. Viene rovinato dal suono integrato.Posso disabilitare il suono di scorrimento UIPickerView?

Comprendo che i suoni del selettore possono essere disattivati ​​a livello globale disattivando i suoni della tastiera nelle impostazioni dell'iPhone/iPod. Ma c'è un modo per farlo in modo programmatico?

Qualsiasi aiuto sarà molto apprezzato!

Grazie

risposta

2

Dopo aver utilizzato questa app per documenti non documentata per oltre un anno su App Store, Apple mi ha chiesto di rimuoverla dalla mia app. È molto frustrante per le app audio avere quel maledetto suono. Il miglior consiglio è quello di condividere con gli utenti che il suono del picker può essere disabilitato globalmente nell'applicazione delle impostazioni in "Suoni" e l'impostazione "Clic della tastiera" su "Off". Raccomando vivamente di visitare https://bugreport.apple.com/ e di archiviare un bug per UIPickerView, poiché può causare distorsioni nelle applicazioni audio quando si fa clic sul selettore.

1

C'è un documentato modo (non sono realmente sicuro se è ancora disponibile in iPhone 3.0) ma qui è alcun modo

#import <UIKit/UIKit.h> 

@interface SilintUIPickerView: UIPickerView 
{ } 

- (void) setSoundsEnabled: (BOOL) enabled; 
@end 

uso questa sottoclasse invece e chiama [view setSoundsEnabled: NO]

Sono interessato a sapere come va nell'ultimo SDK, dargli un colpo e facci sapere.

+0

che funziona perfettamente! grazie mille!! A proposito, sai qual è la particolare Apple con la mancata API non documentata? Questo ha bisogno di raggiungere presto l'App Store. Non vorrei essere respinto e abbattuto a causa di una cosa così piccola :) – infiniteloop

+0

"A proposito, sai quanto particolare è Apple con la mancata API non documentata?" Non so davvero la risposta a questa domanda, prova a cercarla su SO e se non è già stata chiesta, chiediglielo. – hhafez

+0

Attualmente avvisano se si utilizza questo metodo. –

2

hanno appena rifiutato una mia app perché l'uso di apici non documentati ... questo è uno di loro.

7

Ho avuto problemi con un problema audio UIPickerView e anche se è solo parzialmente pertinente alla domanda originale, sto postando il problema/la soluzione qui perché questo argomento continua a venire nei miei risultati di ricerca quindi penso che nessuno altrimenti nella stessa barca potrebbe finire anche qui ...

Avevo bisogno di inizializzare un UIPickerView per ripristinare la riga correntemente selezionata dai dati salvati. Semplice, vero? In viewDidLoad, basta chiamare il selectRow: inComponent: Metodo animato di UIPickerView:

[myPicker selectRow:currentRowIndex inComponent:0 animated:NO]; 

Questo funziona come previsto, ma ha un effetto collaterale che genera un singolo "clic" come se l'utente avesse fatto scorrere il controllo. Il suono del clic si verifica solo quando è in esecuzione su un dispositivo (non sul simulatore) e solo se sul dispositivo è installato iOS 3.x (ho provato con 3.1.3 e 3.2). Questo è apparentemente un bug in iOS che è stato risolto a partire da iOS 4.0. Ma se hai bisogno di indirizzare l'iPhone Gen1, sei bloccato con iOS 3.1.3 dove questo problema è presente.

Ho discusso il problema con Apple DTS, ma non sono stati in grado di suggerire soluzioni alternative oltre all'aggiornamento alla 4.0. Ho chiesto se avrebbero fatto un'eccezione e permesso l'uso del setSoundsEnabled non documentato di cui sopra (che in realtà risolve il problema). La risposta è stata: "Non ci sono eccezioni".

Dopo alcuni lavori di investigazione aggiuntivi, ho scoperto che è possibile impedire che il suono si verifichi rimuovendo temporaneamente UIPickerView dalla superview, chiama selectRow, quindi aggiungilo nuovamente al superview.Per esempio, in viewDidLoad:

UIView *superview = [myPicker superview]; 
[myPicker removeFromSuperview]; 

[myPicker reloadAllComponents]; 
[myPicker selectRow:currentRowIndex inComponent:0 animated:NO]; 

[superview addSubview:myPicker]; 

Questo elimina il suono click estranei senza utilizzare le API non documentate/privato in modo dovrebbe passare processo di approvazione di Apple.

+0

che è sicuramente una manovra intelligente! – infiniteloop

+0

Ottima risposta! Ho cercato di capirlo da molto tempo. – adamsiton

+0

Funziona alla grande, tranne che non è possibile animare le ruote. Ho provato questo con l'animazione attivata, ma cambiando la gerarchia di visualizzazione uccide l'animazione. – bugloaf

1

Qualcuno che conosco dice di aver ottenuto lo scorso revisione App Store proprio la settimana scorsa:

// Hide private API call from Apple static analyzer 
SEL sse = NSSelectorFromString([NSString stringWithFormat:@"%@%@%@", @"set",@"Sounds",@"Enabled:"]); 
if ([UIPickerView instancesRespondToSelector:sse]) { 
    IMP sseimp = [UIPickerView instanceMethodForSelector:sse]; 
    sseimp(self.thePicker, sse, NO); 
} 
+0

Il tuo esempio è scritto in un modo molto sicuro per il futuro, ma non sono sicuro che il codice offuscante per aggirare gli assegni di Apple sia una buona idea. Sono preoccupato che la punizione per un tentativo deliberato di eludere i controlli API possa essere dura. –

1

Potrebbe questo lavoro trucco? Qualcuno era in grado di sopprimere l'effetto sonoro dell'otturatore della macchina fotografica per la riproduzione di una copia invertita del suono nello stesso momento: https://stackoverflow.com/a/23758876/214070

0

ho trovato piccola soluzione sveltina per questo cercano di seguito

 UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, yPickerView, VIEW_WIDTH, PICKERVIEW_HEIGHT)]; 
     pickerView.delegate = self; 
     pickerView.dataSource = self; 
     pickerView.showsSelectionIndicator = YES; 
     pickerView.alpha = 0.8f; 
     pickerView.tag = fieldTag; 
     [pickerView selectRow:pickerViewSelectedIndex inComponent:0 animated:NO]; 

impostare l'animazione: NO per selectRow: metodo

1

Forse questa non è la risposta per questa particolare domanda, ma ho avuto un problema simile - imposta il parametro minimumDate per datePicker, e volevo impostarlo senza fastidioso suono "click". Dopo un po 'di tempo trovato soluzione molto semplice:

datePickerCustomTime.minimumDate = [[NSDate date] dateByAddingTimeInterval:300]// min time to set = now + 5 min 
    [datePickerCustomTime setDate:[[NSDate date] dateByAddingTimeInterval:300] animated:NO]; 
+0

Ecco il codice corretto: 'NSDate * minimumDate = [[Data NSDate] dateByAddingTimeInterval: 300]; if ([datePickerCustomTime.date laterDate: minimumDate] == minimumDate) {[datePickerCustomTime setDate: minimumDate animated: NO]; } datePickerCustomTime.minimumDate = minimumDate; ' – hlfcoding

Problemi correlati