我想禁用UIPickerView在向上和向下滚动时生成的恼人点击。有没有办法做到这一点?我想为拾取器视图所依赖的每个项目播放短音。它被内置的声音破坏了。
据我所知,可以通过关闭iPhone / iPod设置中的键盘声音全局关闭拾音器声音。但有没有办法以编程方式做到这一点?
非常感谢任何帮助!
由于
答案 0 :(得分:7)
我一直在努力解决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开始修复。但是如果你需要针对Gen1 iPhone,你就会遇到存在这个问题的iOS 3.1.3。
我讨论了Apple DTS的问题,但除了升级到4.0之外,他们无法提出任何解决方法。我问他们是否会例外并允许使用上面提到的未记录的setSoundsEnabled(这实际上解决了问题)。答案是,“没有例外。”
经过一些额外的侦探工作,我发现你可以通过暂时从superview中删除UIPickerView来阻止声音发生,调用selectRow,然后将其重新添加到superview。例如,在viewDidLoad:
中UIView *superview = [myPicker superview];
[myPicker removeFromSuperview];
[myPicker reloadAllComponents];
[myPicker selectRow:currentRowIndex inComponent:0 animated:NO];
[superview addSubview:myPicker];
这样可以在不使用未记录的/私有API的情况下消除无关的点击声音,因此应该通过Apple的审批流程。
答案 1 :(得分:5)
在App Store上使用这个特定的未记录的api一年多后,Apple终于要求我将其从我的应用程序中删除。对于音频应用程序来说,这个该死的咔嗒声是非常令人沮丧的。最好的建议是与用户分享可以在“声音”下的设置应用程序中全局禁用拾取器声音,并将“键盘点击”设置为“关闭”。我还强烈建议访问https://bugreport.apple.com/并为UIPickerView提交错误,因为它会在播放选择器点击时导致音频应用程序失真。
答案 2 :(得分:2)
答案 3 :(得分:2)
我认识的人说,他上周刚过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);
}
答案 4 :(得分:1)
有一种未记录的方式(我实际上不确定它是否仍可在iphone 3.0中使用)但是这里有任何方式
#import <UIKit/UIKit.h>
@interface SilintUIPickerView: UIPickerView
{ }
- (void) setSoundsEnabled: (BOOL) enabled;
@end
使用此子类并调用[view setSoundsEnabled: NO]
我很想知道它在最新的SDK中的用途,试一试并告诉我们。
答案 5 :(得分:1)
这招可以吗?有人能够通过在同一时刻播放声音的反转副本来抑制相机快门音效:https://stackoverflow.com/a/23758876/214070
答案 6 :(得分:1)
也许这不是这个特定问题的答案,但我遇到了类似的问题 - 为datePicker设置minimumDate,我想要设置它而不会产生恼人的“点击”声音。经过一段时间发现非常简单的解决方案:
datePickerCustomTime.minimumDate = [[NSDate date] dateByAddingTimeInterval:300]// min time to set = now + 5 min
[datePickerCustomTime setDate:[[NSDate date] dateByAddingTimeInterval:300] animated:NO];
答案 7 :(得分:0)
我在下面的尝试中找到了小的快速解决方案
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
设置动画:NO