我可以禁用UIPickerView滚动声音吗?

时间:2009-09-17 23:26:11

标签: objective-c iphone cocoa-touch ipod-touch

我想禁用UIPickerView在向上和向下滚动时生成的恼人点击。有没有办法做到这一点?我想为拾取器视图所依赖的每个项目播放短音。它被内置的声音破坏了。

据我所知,可以通过关闭iPhone / iPod设置中的键盘声音全局关闭拾音器声音。但有没有办法以编程方式做到这一点?

非常感谢任何帮助!

由于

8 个答案:

答案 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)

他们刚刚拒绝了我的应用程序,因为使用了无证件的api ......就是其中之一。

答案 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