Могу ли я отключить прокрутку звука UIPickerView?

Я хочу отключить раздражающие клики, которые генерирует UIPickerView при прокрутке вверх и вниз. Есть ли способ сделать это? Я хочу воспроизводить короткие звуки для каждого элемента, на который попадает изображение выбора. Он разрушается встроенным звуком.

Я понимаю, что звуковые сигналы выбора можно отключить глобально, отключив звуки клавиатуры в настройках iPhone/iPod. Но есть ли способ программно сделать это?

Любая помощь будет очень признательна!

Спасибо

Ответ 1

После использования этого конкретного недокументированного api в течение года в App Store Apple, наконец, попросила меня удалить его из моего приложения. Это очень неприятно для звуковых приложений, которые имеют этот проклятый звук щелчка. Лучший совет - поделиться с пользователями тем, что звук выбора может быть отключен глобально в приложении настроек в разделе "Звуки" и установке "Клавишные клики" на "Выкл.". Я также настоятельно рекомендую посетить https://bugreport.apple.com/ и подавать ошибку для UIPickerView, так как это может вызвать искажение в звуковых приложениях при нажатии на стрелку выбора.

Ответ 2

Я боролся с проблемой звука UIPickerView, и хотя это только частично относится к исходному вопросу, я размещаю проблему/решение здесь, потому что этот вопрос продолжает появляться в моих результатах поиска, поэтому я думаю, что кто-то еще в этой же лодке тоже может оказаться здесь...

Мне нужно было инициализировать UIPickerView для восстановления текущей выбранной строки из сохраненных данных. Простой, не так ли? В viewDidLoad просто вызовите selectRow: inComponent: анимированный метод UIPickerView:

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

Это работает так, как ожидалось, но имеет побочный эффект: он генерирует один звук "click", как если бы пользователь прокрутил элемент управления. Звук щелчка возникает только при работе на устройстве (а не в симуляторе), и только если на устройстве установлено iOS 3.x(я тестировал с 3.1.3 и 3.2). По-видимому, это была ошибка в iOS, которая была исправлена ​​с iOS 4.0. Но если вам нужно настроить iPhone Gen1, вы застряли с iOS 3.1.3, где присутствует эта проблема.

Я обсуждал проблему с Apple DTS, но они не могли предложить никаких обходных решений, кроме обновления до 4.0. Я спросил, будут ли они делать исключение и разрешить использование недокументированного setSoundsEnabled, упомянутого выше (что фактически решает проблему). Ответ был: "Исключений нет".

После некоторой дополнительной детективной работы я обнаружил, что вы можете предотвратить появление звука, временно удалив UIPickerView из супервизора, вызовите selectRow, а затем снова добавьте его в супервизор. Например, в viewDidLoad:

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

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

[superview addSubview:myPicker];

Это избавляет от постороннего звука щелчка, не используя недокументированные/частные API, поэтому должен пройти процесс утверждения Apple.

Ответ 3

они только что отклонили мое приложение, потому что использование недокументированных api... это один из них.

Ответ 4

Существует недокументированный способ (я на самом деле не уверен, что он все еще доступен в iphone 3.0), но здесь он каким-либо образом

#import <UIKit/UIKit.h>

@interface SilintUIPickerView: UIPickerView
{ }

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

используйте этот подкласс и вызовите [view setSoundsEnabled: NO]

Мне интересно узнать, как это происходит в последнем SDK, дать ему шанс и сообщить нам.

Ответ 5

Кто-то, кого я знаю, говорит, что он прошёл последнюю версию App Store только на прошлой неделе:

// 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);
}

Ответ 6

Может ли этот трюк работать? Кто-то смог подавить звуковой эффект затвора камеры, воспроизведя перевернутую копию звука в тот же момент: fooobar.com/questions/15544/...

Ответ 7

Возможно, это не ответ на этот конкретный вопрос, но у меня была аналогичная проблема - установите minimumDate для datePicker, и я хотел установить его без раздражающего звука "click". Через некоторое время найдено очень простое решение:

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

Ответ 8

Я нашел небольшое быстрое решение для этой попытки ниже

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

установите анимированный: НЕТ для selectRow: method