2009-09-17 4 views
9

Je veux désactiver les clics ennuyeux que l'UIPickerView génère en faisant défiler vers le haut et vers le bas. Y a-t-il un moyen de faire cela? Je veux jouer des sons courts pour chaque élément sur lequel la vue du sélecteur se pose. Il est ruiné par le son intégré.Puis-je désactiver le son de défilement UIPickerView?

Je comprends que les sons du sélecteur peuvent être désactivés globalement en désactivant les sons du clavier dans les paramètres iPhone/iPod. Mais existe-t-il un moyen de le faire par programme?

Toute aide sera grandement appréciée!

Merci

Répondre

2

Après avoir utilisé cette API non documentée spécifique pendant plus d'un an sur l'App Store, Apple m'a finalement demandé de le retirer de mon App. Il est très frustrant pour les applications audio d'avoir ce satané son de clic. Le meilleur conseil est de partager avec les utilisateurs que le son du sélecteur peut être désactivé globalement dans l'application des paramètres sous "Sons" et en réglant "Clics du clavier" sur "Non". Je recommande également fortement de visiter le https://bugreport.apple.com/ et de déposer un bogue pour UIPickerView, car il peut causer de la distorsion dans les applications audio lorsque le clic du sélecteur est joué.

1

Il y a une façon non documentée (je suis en fait pas sûr si elle est toujours disponible dans l'iPhone 3.0), mais ici, il n'y a aucune façon

#import <UIKit/UIKit.h> 

@interface SilintUIPickerView: UIPickerView 
{ } 

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

utiliser cette sous-classe et à la place appelez [view setSoundsEnabled: NO]

Je suis intéressé à savoir comment ça se passe dans le dernier SDK, donnez-moi un coup de feu et faites le nous savoir.

+0

qui fonctionne parfaitement! Merci beaucoup!! Au fait, savez-vous à quel point Apple est incapable d'ignorer les API non documentées? Cela doit bientôt arriver dans l'App Store. Je ne veux pas être rejeté et découragé à cause d'une chose si petite :) – infiniteloop

+0

"Au fait, savez-vous à quel point Apple est avec l'API non documentée?" Je ne connais vraiment pas la réponse à cette question, essayez de la rechercher sur SO et si cela n'a pas déjà été demandé, demandez-le. – hhafez

+0

Ils vous préviennent actuellement si vous utilisez cette méthode. –

2

ils viennent de rejeter une de mes applications parce que l'utilisation d'api non documentés ... c'est l'un d'entre eux.

7

Je suis aux prises avec un problème de son UIPickerView, et même si ce n'est que partiellement pertinent à la question initiale, je publie le problème/solution ici parce que ce sujet revient dans mes résultats de recherche. d'autre part dans le même bateau peut finir ici aussi ...

J'avais besoin d'initialiser un UIPickerView pour restaurer la ligne actuellement sélectionnée à partir des données enregistrées. Simple, non? Dans viewDidLoad, il suffit d'appeler la selectRow: inComponent: méthode d'animation de UIPickerView:

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

Cela fonctionne comme prévu, mais a un effet secondaire qu'il génère un « clic » comme si l'utilisateur avait fait défiler le contrôle. Le son du clic ne se produit que lors de l'exécution sur un périphérique (pas le simulateur), et seulement si le périphérique iOS 3.x est installé (j'ai testé avec 3.1.3 et 3.2). C'était apparemment un bug dans iOS qui a été corrigé à partir d'iOS 4.0. Mais si vous avez besoin de cibler l'iPhone Gen1, vous êtes coincé avec iOS 3.1.3 où ce problème est présent. J'ai discuté du problème avec Apple DTS, mais ils ont été incapables de suggérer une solution de contournement autre que la mise à niveau vers 4.0. J'ai demandé s'ils feraient une exception et autoriseraient l'utilisation du setSoundsEnabled non documenté mentionné ci-dessus (qui résout réellement le problème). La réponse était: "Il n'y a pas d'exceptions". Après un travail de détective supplémentaire, j'ai découvert que vous pouviez empêcher le son de se produire en supprimant temporairement UIPickerView de la vue d'ensemble, en appelant selectRow, puis en l'ajoutant de nouveau à la vue d'ensemble.Par exemple, dans viewDidLoad:

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

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

[superview addSubview:myPicker]; 

Cela se débarrasse du son de clic étranger sans utiliser API non documentées/privé devrait donc passer le processus d'approbation d'Apple.

+0

qui est une manoeuvre intelligente à coup sûr! – infiniteloop

+0

Bonne réponse! J'ai essayé de comprendre cela depuis longtemps. – adamsiton

+0

Cela fonctionne très bien, sauf que vous ne pouvez pas animer les roues. J'ai essayé ceci avec l'animation activée, mais changer la hiérarchie de vue tue l'animation. – bugloaf

1

Quelqu'un que je sais, dit-il a ce passé l'examen App Store, la semaine dernière:

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

Votre exemple est écrit d'une manière très sûre à l'avenir, mais je ne suis pas sûr que le code obfusant pour contourner les chèques d'Apple est une bonne idée. Je crains que la punition pour une tentative délibérée de contourner leurs contrôles API peut être sévère. –

0

J'ai trouvé petite solution quickie pour cet essai ci-dessous

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

mis le film d'animation: NO pour selectRow: méthode

1

Peut-être ce n'est pas la réponse à cette question particulière, mais j'ai eu un problème similaire - set minimumDate pour datePicker, et je voulais le définir sans bruit "click" ennuyeux. Après un certain temps trouvé une solution très simple:

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

Voici le code correct: 'NSDate * minimumDate = [[NSDate date] dateByAddingTimeInterval: 300]; if ([datePickerCustomTime.date laterDate: date minimale] == minimumDate) {[datePickerCustomTime setDate: date minimale animée: NO]; } datePickerCustomTime.minimumDate = minimumDate; – hlfcoding