Могу ли я отключить звук прокрутки UIPickerView? - PullRequest
11 голосов
/ 18 сентября 2009

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

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

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

Спасибо

Ответы [ 8 ]

7 голосов
/ 04 ноября 2010

Я боролся с проблемой звука в 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.

5 голосов
/ 05 апреля 2010

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

2 голосов
/ 13 марта 2014

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

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

1 голос
/ 23 октября 2015

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

datePickerCustomTime.minimumDate = [[NSDate date] dateByAddingTimeInterval:300]// min time to set = now + 5 min
  [datePickerCustomTime setDate:[[NSDate date] dateByAddingTimeInterval:300] animated:NO];
1 голос
/ 23 мая 2014

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

1 голос
/ 18 сентября 2009

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

#import <UIKit/UIKit.h>

@interface SilintUIPickerView: UIPickerView
{ }

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

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

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

0 голосов
/ 19 марта 2015

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

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

...