2009-09-17 16 views
9

Chcę wyłączyć denerwujące kliknięcia generowane przez UIPickerView podczas przewijania w górę iw dół. Czy jest jakiś sposób na zrobienie tego? Chcę odtwarzać krótkie dźwięki dla każdego elementu, na który trafia widok próbny. Zostaje zrujnowany przez wbudowany dźwięk.Czy mogę wyłączyć dźwięk przewijania UIPickerView?

Rozumiem, że dźwięki selekcji można wyłączyć globalnie, wyłączając dźwięki klawiatury w ustawieniach telefonu iPhone/odtwarzacza iPod. Ale czy istnieje sposób, aby to zrobić programowo?

Każda pomoc będzie doceniona!

Dzięki

Odpowiedz

2

Po użyciu tego konkretnego nieudokumentowanego api przez ponad rok w App Store Apple w końcu poprosił mnie o usunięcie go z mojej aplikacji. To bardzo frustrujące dla aplikacji audio, że mają ten cholerny dźwięk kliknięcia. Najlepszą radą jest udostępnienie użytkownikom, że dźwięk próbny można wyłączyć globalnie w aplikacji ustawień pod "Dźwięki" i ustawienie "Kliknięcia klawiatury" na "Wył.". Gorąco polecam odwiedzanie strony https://bugreport.apple.com/ i zgłaszanie błędu dla UIPickerView, ponieważ może to powodować zniekształcenia w aplikacjach dźwiękowych, gdy jest odtwarzane kliknięcie.

1

Jest nieudokumentowane sposób (I rzeczywiście nie jestem pewien, czy to jest nadal dostępny w iPhone 3.0), ale tutaj jest to jakiś sposób

#import <UIKit/UIKit.h> 

@interface SilintUIPickerView: UIPickerView 
{ } 

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

użycie Podklasa ta zamiast i zadzwoń pod numer [view setSoundsEnabled: NO]

Chcę wiedzieć, jak to działa w najnowszym SDK, daj mu szansę i daj nam znać.

+0

, które działa idealnie! Dziękuję bardzo!! A propos, czy wiesz, jak konkretnie Apple radzi sobie z nieudokumentowanym API? To musi wkrótce trafić do sklepu App Store. Nie chciałbym być odrzucony i przygnębiony z powodu czegoś tak małego :) – infiniteloop

+0

"A tak przy okazji, czy wiesz, jak konkretnie Apple radzi sobie z nieudokumentowanym API?" Naprawdę nie znam odpowiedzi na to pytanie, spróbuj przeszukać to na SO, a jeśli nie zostało już zadane, zapytaj. – hhafez

+0

Ostrzegają cię, jeśli używasz tej metody. –

2

oni właśnie odrzucili moją aplikację, ponieważ użycie nieudokumentowanego api ... to jeden z nich.

7

Zmagam się z problemem dźwiękowym UIPickerView i chociaż jest to tylko częściowo związane z pierwotnym pytaniem, zamieszczam tutaj problem/rozwiązanie, ponieważ ten temat pojawia się coraz częściej w moich wynikach wyszukiwania, więc myślę, że każdy w innym przypadku w tej samej łodzi może się tutaj skończyć ...

Potrzebowałem zainicjować UIPickerView, aby przywrócić aktualnie wybrany wiersz z zapisanych danych. Proste, prawda? W viewDidLoad, po prostu zadzwoń do selectRow: inComponent: animowane sposób UIPickerView:

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

To działa zgodnie z oczekiwaniami, ale ma efekt uboczny, że generuje pojedynczy dźwięk „kliknięcia”, jak gdyby użytkownik miał przewijane kontrolę. Dźwięk kliknięcia występuje tylko podczas działania na urządzeniu (nie symulatorze) i tylko wtedy, gdy urządzenie ma zainstalowany system iOS 3.x (testowałem w wersji 3.1.3 i 3.2). To był najwyraźniej błąd w iOS, który został naprawiony począwszy od iOS 4.0. Ale jeśli potrzebujesz kierować na iPhone'a Gen 1, utkniesz w systemie iOS 3.1.3, gdzie ten problem jest obecny.

Omówiłem tę kwestię z Apple DTS, ale nie byli w stanie zaproponować żadnego obejścia innego niż uaktualnienie do 4.0. Zapytałem, czy zrobią wyjątek i pozwolą na użycie wspomnianego powyżej nieudokumentowanego setSoundsEnabled (co faktycznie rozwiązuje problem). Odpowiedź brzmiała: "Nie ma wyjątków".

Po kilku dodatkowych pracach detektywistycznych odkryłem, że można zapobiec powstawaniu dźwięku, tymczasowo usuwając UIPickerView z podglądu, zadzwoń do selectRow, a następnie dodaj go ponownie do superview.Na przykład, w viewDidLoad:

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

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

[superview addSubview:myPicker]; 

ten pozbywa się obcych click dźwięku bez użycia nielegalnych/private API więc należy przejść proces zatwierdzania Apple.

+0

, to na pewno pewne sprytne manewrowanie! – infiniteloop

+0

Świetna odpowiedź! Próbowałem to zrozumieć przez długi czas. – adamsiton

+0

Działa to świetnie, z tym że nie można animować kół. Próbowałem tego przy włączonej animacji, ale zmiana hierarchii widoku zabija animację. – bugloaf

1

Ktoś wiem, mówi, że dostał tę przeszłość przeglądu App Store właśnie ostatni tydzień:

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

Twój przykład jest napisany w sposób bezpieczny w przyszłości, ale nie jestem pewien, czy zamazywanie kodu w celu obejścia czeków Apple jest dobrym pomysłem. Obawiam się, że kara za umyślną próbę obejścia kontroli interfejsu API może być trudna. –

0

znalazłem mały rozwiązanie numerek tego spróbować poniżej

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

ustawić animowane: NIE dla selectRow: metoda

1

Może to nie jest odpowiedź na to konkretne pytanie, ale miałem podobny problem - ustaw minimalną datę dla datePicker, a chciałem ustawić bez denerwującego dźwięku "kliknięcia". Po pewnym czasie znaleziono bardzo proste rozwiązanie:

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

Oto poprawny kod: 'NSDate * minimumDate = [[NSDate date] dateByAddingTimeInterval: 300]; if ([datePickerCustomTime.date laterDate: minimumDate] == minimumDate) {[datePickerCustomTime setDate: minimumDate animated: NO]; } datePickerCustomTime.minimumDate = minimumDate; ' – hlfcoding