11

我想禁用 UIPickerView 在上下滚动时产生的烦人的点击。有没有办法做到这一点?我想为选择器视图所在的每个项目播放简短的声音。它被内置的声音破坏了。

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

任何帮助都感激不尽!

谢谢

4

8 回答 8

7

我一直在努力解决 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 的批准流程。

于 2010-11-04T04:35:22.380 回答
5

在 App Store 上使用这个特定的无证 api 一年多后,Apple 终于要求我从我的应用程序中删除它。音频应用程序有那种该死的点击声是非常令人沮丧的。最好的建议是与用户分享选择器声音可以在“声音”下的设置应用程序中全局禁用,并将“键盘点击”设置为“关闭”。我还强烈建议访问https://bugreport.apple.com/并为 UIPickerView 提交错误,因为它会在播放选择器点击时导致音频应用程序失真。

于 2010-04-05T06:22:49.700 回答
2

他们刚刚拒绝了我的一个应用程序,因为使用了未记录的 api ......这就是其中之一。

于 2010-03-10T09:24:15.313 回答
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);
}
于 2014-03-13T16:31:56.747 回答
1

有一种未记录的方式(我实际上不确定它是否在 iphone 3.0 中仍然可用)但这里有任何方式

#import <UIKit/UIKit.h>

@interface SilintUIPickerView: UIPickerView
{ }

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

改用这个子类并调用[view setSoundsEnabled: NO]

我有兴趣了解它在最新的 SDK 中的运行情况,试一试并告诉我们。

于 2009-09-17T23:59:43.973 回答
1

这招行得通吗?有人能够通过同时播放声音的倒置副本来抑制相机快门音效:https ://stackoverflow.com/a/23758876/214070

于 2014-05-23T18:18:40.937 回答
1

也许这不是这个特定问题的答案,但我有一个类似的问题 - 为 datePicker 设置 minimumDate,我想设置它而不会有烦人的“点击”声音。一段时间后发现非常简单的解决方案:

datePickerCustomTime.minimumDate = [[NSDate date] dateByAddingTimeInterval:300]// min time to set = now + 5 min
  [datePickerCustomTime setDate:[[NSDate date] dateByAddingTimeInterval:300] animated:NO];
于 2015-10-23T11:55:43.783 回答
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: 方法设置动画:NO

于 2015-03-19T07:50:40.647 回答