我想禁用 UIPickerView 在上下滚动时产生的烦人的点击。有没有办法做到这一点?我想为选择器视图所在的每个项目播放简短的声音。它被内置的声音破坏了。
我知道选择器声音可以通过关闭 iPhone/iPod 设置中的键盘声音来全局关闭。但是有没有办法以编程方式做到这一点?
任何帮助都感激不尽!
谢谢
我想禁用 UIPickerView 在上下滚动时产生的烦人的点击。有没有办法做到这一点?我想为选择器视图所在的每个项目播放简短的声音。它被内置的声音破坏了。
我知道选择器声音可以通过关闭 iPhone/iPod 设置中的键盘声音来全局关闭。但是有没有办法以编程方式做到这一点?
任何帮助都感激不尽!
谢谢
我一直在努力解决 UIPickerView 声音问题,尽管它仅与原始问题部分相关,但我在此处发布问题/解决方案,因为该主题不断出现在我的搜索结果中,所以我认为其他人在同一船也可能在这里结束……</p>
我需要初始化 UIPickerView 以从保存的数据中恢复当前选定的行。很简单,对吧?在viewDidLoad中,调用UIPickerView的selectRow:inComponent:animated方法即可:
[myPicker selectRow:currentRowIndex inComponent:0 animated:NO];
这按预期工作,但有一个副作用,即它会生成一个“点击”声音,就好像用户滚动了控件一样。只有在设备(不是模拟器)上运行时才会发出咔哒声,并且只有在设备安装了 iOS 3.x 时才会出现(我用 3.1.3 和 3.2 进行了测试)。这显然是从 iOS 4.0 开始修复的 iOS 中的错误。但是,如果您需要以 Gen1 iPhone 为目标,那么您将被困在存在此问题的 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 上使用这个特定的无证 api 一年多后,Apple 终于要求我从我的应用程序中删除它。音频应用程序有那种该死的点击声是非常令人沮丧的。最好的建议是与用户分享选择器声音可以在“声音”下的设置应用程序中全局禁用,并将“键盘点击”设置为“关闭”。我还强烈建议访问https://bugreport.apple.com/并为 UIPickerView 提交错误,因为它会在播放选择器点击时导致音频应用程序失真。
他们刚刚拒绝了我的一个应用程序,因为使用了未记录的 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 设置 minimumDate,我想设置它而不会有烦人的“点击”声音。一段时间后发现非常简单的解决方案:
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];
为 selectRow: 方法设置动画:NO