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

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

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

Любая помощь будет высоко ценится!

Спасибо

8 ответов

Решение

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

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

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

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

Это работает, как и ожидалось, но имеет побочный эффект: генерируется одиночный звук "щелчка", как если бы пользователь прокручивал элемент управления. Звук щелчка возникает только при запуске на устройстве (не на симуляторе) и только в том случае, если на устройстве установлена ​​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.

Кто-то из моих знакомых говорит, что он прошел этот обзор в 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);
}

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

Может ли этот трюк сработать? Кто-то смог подавить звуковой эффект затвора камеры, одновременно воспроизведя перевернутую копию звука: /questions/28260072/avfoundation-kak-otklyuchit-zvuk-zatvora-kogda-capturestillimageasynchronouslyfromconnection/28260080#28260080

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

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

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

#import <UIKit/UIKit.h>

@interface SilintUIPickerView: UIPickerView
{ }

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

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

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

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

        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: метод

Другие вопросы по тегам