You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UIPickerView滚动音效消失问题求助

UIPickerView滚动音效消失的解决办法

核心问题分析

UIPickerView的默认滚动音效不关联键盘音效,而是绑定系统「按键音」设置;部分iOS版本更新后,系统可能取消了UIPickerView自动播放滚动音效的默认行为,需要手动实现。


1. 先检查系统设置(快速排查)

打开系统「设置」→「声音与触感」,确保「按键音」处于开启状态。你之前调整键盘音效没用,是因为两者不属于同一设置项。

如果开启后音效恢复,说明只是系统设置被重置;如果还是没效果,继续看下面的手动实现方案。

2. 手动实现滚动音效(适配新系统)

以下提供两种轻量方案,按需选择:

方案一:使用SystemSoundID(模拟系统按键音)

适合需要和系统默认音效一致的场景,无需额外导入音效文件。

步骤1:导入框架

#import <AudioToolbox/AudioToolbox.h>

步骤2:添加变量并初始化音效

修改你的ViewController代码:

@interface ViewController () <UIPickerViewDataSource, UIPickerViewDelegate, UIScrollViewDelegate>
{
    NSArray *_pickerData;
    SystemSoundID _scrollSoundID;
    NSInteger _lastSelectedRow; // 记录上一次滚动到的行
}
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    _pickerData = @[@"ThaHood", @"Street", @"Cassette", @"Eastside", @"Chill", @"Jamming", @"Beat 2", @"Beat 3", @"The Hall", @"Funkit", @"Sided", @"Nisquare", @"Final Day", @"Recruit", @"Cypher", @"Angels", @"Super", @"Mortal"];
    
    _picker.dataSource = self;
    _picker.delegate = self;
    _picker.scrollView.delegate = self; // 绑定滚动代理
    
    // 初始化系统按键音效
    NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"Tock" ofType:@"aiff" inDirectory:@"Audio/UISounds"];
    if (soundPath) {
        NSURL *soundURL = [NSURL fileURLWithPath:soundPath];
        AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundURL, &_scrollSoundID);
    }
    
    // 记录初始选中行
    _lastSelectedRow = [_picker selectedRowInComponent:0];
}

步骤3:监听滚动并播放音效

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    NSInteger currentRow = [_picker selectedRowInComponent:0];
    // 每切换一行播放一次音效
    if (currentRow != _lastSelectedRow) {
        AudioServicesPlaySystemSound(_scrollSoundID);
        _lastSelectedRow = currentRow;
    }
}

// 记得释放音效资源
- (void)dealloc {
    AudioServicesDisposeSystemSoundID(_scrollSoundID);
}

方案二:使用自定义音效(更灵活)

如果需要替换成自己的音效文件,用AVFoundation实现:

步骤1:导入框架

#import <AVFoundation/AVFoundation.h>

步骤2:初始化音效播放器

@interface ViewController () <UIPickerViewDataSource, UIPickerViewDelegate, UIScrollViewDelegate>
{
    NSArray *_pickerData;
    AVAudioPlayer *_scrollPlayer;
    NSInteger _lastSelectedRow;
}
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 原有代码...
    
    // 加载自定义音效(替换成你的音效路径)
    NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"custom-scroll-sound" ofType:@"mp3"];
    NSURL *soundURL = [NSURL fileURLWithPath:soundPath];
    NSError *error = nil;
    _scrollPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:&error];
    if (!error) {
        [_scrollPlayer prepareToPlay];
    }
    
    _lastSelectedRow = [_picker selectedRowInComponent:0];
    _picker.scrollView.delegate = self;
}

步骤3:滚动时播放

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    NSInteger currentRow = [_picker selectedRowInComponent:0];
    if (currentRow != _lastSelectedRow) {
        [_scrollPlayer play];
        _lastSelectedRow = currentRow;
    }
}

关于Storyboard的说明

UIPickerView在Storyboard中没有任何与音效相关的配置项,所以无需检查这里的设置。

内容的提问来源于stack exchange,提问作者Sktsalad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 00:55:00