Могу ли я отключить звук прокрутки UIPickerView?
-
10-07-2019 - |
Вопрос
Я хочу отключить раздражающие клики, которые генерирует UIPickerView при прокрутке вверх и вниз.Есть ли способ сделать это?Я хочу воспроизводить короткие звуки для каждого элемента, на который попадает окно выбора.Это портится встроенным звуком.
Я понимаю, что звуки выбора можно отключить глобально, отключив звуки клавиатуры в настройках iPhone / iPod.Но есть ли способ программно сделать это?
Любая помощь будет высоко оценена!
Спасибо
Решение
После более года использования этого конкретного недокументированного 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.
они только что отклонили мое приложение, потому что использование недокументированных API... это один из них.
Кто-то из моих знакомых говорит, что он узнал об этом из обзора 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);
}
Есть недокументированный способ (я на самом деле не уверен, доступен ли он еще в iphone 3.0), но здесь все равно
#import <UIKit/UIKit.h>
@interface SilintUIPickerView: UIPickerView
{ }
- (void) setSoundsEnabled: (BOOL) enabled;
@end
вместо этого используйте этот подкласс и позвоните [view setSoundsEnabled: NO]
Мне интересно узнать, как обстоят дела в последней версии SDK, попробуйте и дайте нам знать.
Может ли этот трюк сработать?Кто-то смог подавить звуковой эффект затвора камеры, воспроизведя в тот же момент инвертированную копию звука: https://stackoverflow.com/a/23758876/214070
Возможно, это не ответ на этот конкретный вопрос, но у меня была аналогичная проблема - установите минимальную дату для datePicker, и я хотел установить ее без раздражающего звука щелчка.Через некоторое время нашел очень простое решение:
datePickerCustomTime.minimumDate = [[NSDate date] dateByAddingTimeInterval:300]// min time to set = now + 5 min
[datePickerCustomTime setDate:[[NSDate date] dateByAddingTimeInterval:300] animated:NO];
Ниже я нашел небольшое быстрое решение для этой попытки.
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];
установите анимированный:NO для selectRow:метод