2009-09-17 8 views
9

Quiero desactivar los molestos clics que genera el UIPickerView al desplazarse hacia arriba y hacia abajo. ¿Hay alguna forma de hacer esto? Quiero reproducir sonidos breves para cada elemento al que llegue la vista del selector. Se arruina por el sonido incorporado.¿Puedo desactivar el sonido de desplazamiento UIPickerView?

Entiendo que los sonidos del selector pueden desactivarse globalmente apagando los sonidos del teclado en la configuración de iPhone/iPod. Pero, ¿hay alguna manera de hacer esto programáticamente?

¡Cualquier ayuda será muy apreciada!

Gracias

Respuesta

2

Después de usar esta aplicación específica no documentada durante más de un año en la App Store Apple finalmente me pidió que la eliminara de mi aplicación. Es muy frustrante para las aplicaciones de audio tener ese maldito sonido de clic. El mejor consejo es compartir con los usuarios que el sonido del selector puede deshabilitarse globalmente en la aplicación de configuración en "Sonidos" y configurando "Clics del teclado" en "Desactivado". También recomiendo visitar https://bugreport.apple.com/ y archivar un error para UIPickerView, ya que puede causar distorsión en las aplicaciones de audio cuando se reproduce el selector.

1

Hay un indocumentado manera (no estoy realmente seguro de si todavía está disponible en iPhone 3.0) pero aquí está de ninguna manera

#import <UIKit/UIKit.h> 

@interface SilintUIPickerView: UIPickerView 
{ } 

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

uso esta subclase lugar y llame al [view setSoundsEnabled: NO]

Me interesa saber cómo funciona en el último SDK, pruébelo y avísenos.

+0

que funciona a la perfección! ¡¡Muchas gracias!! Por cierto, ¿sabes cuán particular es Apple al rechazar la API no documentada? Esto debe llegar a la tienda de aplicaciones pronto. No querría ser rechazado y abatido por algo tan pequeño :) – infiniteloop

+0

"Por cierto, ¿sabes cuán particular es Apple al rechazar la API no documentada?" Realmente no sé la respuesta a esa pregunta, intente buscarla en SO y, si aún no la ha preguntado, hágala. – hhafez

+0

Actualmente, te avisan si usas este método. –

2

acaban de rechazar una aplicación mía porque el uso de api indocumentadas ... esa es una de ellas.

7

He estado luchando con un problema de sonido UIPickerView, y aunque es solo parcialmente relevante para la pregunta original, estoy publicando el problema/solución aquí porque este tema sigue apareciendo en mis resultados de búsqueda, así que creo que cualquier persona más en el mismo barco puede terminar aquí también ...

Necesitaba inicializar un UIPickerView para restaurar la fila seleccionada actualmente de los datos guardados. Simple, ¿verdad? En viewDidLoad, simplemente llame a la selectRow: inComponent: Método animada de UIPickerView:

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

Esto funciona como se esperaba, pero tiene un efecto secundario que genera un sonido "clic", como si el usuario hubiera desplazado el control. El sonido de clic solo se produce cuando se ejecuta en un dispositivo (no en el simulador) y solo si el dispositivo tiene iOS 3.x instalado (probé con 3.1.3 y 3.2). Esto fue aparentemente un error en iOS que se solucionó comenzando con iOS 4.0. Pero si necesita apuntar al iPhone Gen1, tiene problemas con iOS 3.1.3 donde este problema está presente.

Discutí el problema con Apple DTS, pero no pudieron sugerir ninguna solución alternativa a la actualización a 4.0. Pregunté si harían una excepción y permitirían el uso del setSoundsEnabled indocumentado mencionado anteriormente (que realmente resuelve el problema). La respuesta fue: "No hay excepciones".

Después de un trabajo de detección adicional, descubrí que puede evitar que el sonido se produzca al quitar temporalmente el UIPickerView de la supervista, llamar a SelectRow, luego volver a agregarlo a la supervista.Por ejemplo, en viewDidLoad:

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

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

[superview addSubview:myPicker]; 

Esto se deshace del sonido de clic ajeno sin el uso de las API de indocumentados/privada por lo que debe pasar el proceso de aprobación de Apple.

+0

¡eso es una maniobra inteligente segura! – infiniteloop

+0

¡Gran respuesta! He estado tratando de resolver esto por mucho tiempo. – adamsiton

+0

Esto funciona muy bien, excepto que no puede animar las ruedas. Intenté esto con la animación habilitada, pero cambiar la jerarquía de vista mata la animación. – bugloaf

1

Alguien que conozco dice que consiguió el pasado la revisión App Store la semana pasada:

// 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

Su ejemplo está escrito de una manera muy segura para el futuro, pero no estoy seguro de que ofuscar el código para evitar los cheques de Apple sea una buena idea. Me preocupa que el castigo por un intento deliberado de eludir sus controles API sea duro. –

0

encontré solución rapidito pequeño para este intenta a continuación

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

establecer la animación: no para selectRow: método

1

Quizás esta no sea la respuesta para esta pregunta en particular, pero tuve un problema similar: establecí minimumDate para datePicker, y quería configurarlo sin molestar el "clic". Después de algún tiempo encontró una solución muy simple:

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

Aquí está el código correcto: 'NSDate * minimumDate = [[NSDate date] dateByAddingTimeInterval: 300]; if ([datePickerCustomTime.date laterDate: minimumDate] == minimumDate) {[datePickerCustomTime setDate: minimumDate animated: NO]; } datePickerCustomTime.minimumDate = minimumDate; ' – hlfcoding

Cuestiones relacionadas