【问题标题】:UISelectionFeedbackGenerator() not working on iPhone 7UISelectionFeedbackGenerator() 在 iPhone 7 上不起作用
【发布时间】:2016-12-12 09:57:46
【问题描述】:

我想在我的应用中使用一些触觉。我正在使用UISelectionFeedbackGenerator,但它不起作用。我正在使用 iOS 10 的真实 iPhone 7 上进行测试。这两行应该可以发挥作用——但什么也没有发生:

let generator = UISelectionFeedbackGenerator()
generator.selectionChanged()

【问题讨论】:

  • 你找到解决办法了吗?
  • 我在同一条船上。在我的一个视图控制器中,触觉反馈无法正常工作。另一方面,即使没有准备,它也可以工作。我一辈子都无法理解发生了什么。

标签: ios iphone swift ios10 haptic-feedback


【解决方案1】:

似乎AVFoundation(或者可能只是AVCaptureSession)在某种程度上扰乱了触觉反馈!如果没有AVFoundation,我的触觉反馈会起作用。一旦我把它放在那里,它就停止工作了。

【讨论】:

    【解决方案2】:

    以下是一些适用于旧设备的替代方案:

    import AudioToolbox
    
    AudioServicesPlaySystemSound(1519) // Actuate `Peek` feedback (weak boom)
    AudioServicesPlaySystemSound(1520) // Actuate `Pop` feedback (strong boom)
    AudioServicesPlaySystemSound(1521) // Actuate `Nope` feedback (series of three weak booms)
    

    【讨论】:

      【解决方案3】:

      在致电selectionChanged() 之前,您需要致电generator.prepare()。这会唤醒 Taptic 引擎。不过它会在几秒钟内保持活动状态,所以如果你打算在路上打电话给selectionChanged(),请确保你再次prepare()

      let generator = UISelectionFeedbackGenerator()
      generator.prepare()
      generator.selectionChanged()
      

      【讨论】:

      • 我确定我也尝试过 prepare()。我会再试一次并报告。谢谢!
      • 我没有让它工作。由于我正在为 iOS 9 构建应用程序,因此我将这些行包装在 if #available(iOS 10.0, *) { ... } 中。但对于没有条件的 iOS 10,它也无法在我的 iPhone 7 上运行。这也是我在 stackoverflow 上发布之前所尝试的。
      • 奇数。您是否在手机级别设置了禁用 Taptics 的辅助功能?您是否尝试过在 Apple 股票应用程序中使用日期选择器或移动表格视图单元格以确保您感受到他们的敲击声?
      • 这很奇怪。在我的应用程序中捕获图像后,它可以工作(捕获图像和触觉按钮彼此无关 - 触觉未绑定在捕获按钮上)。当我重建应用程序时,触觉反馈在我再次捕获图像之前不起作用。使用AVCaptureSession 时对触觉反馈有限制吗?
      • @KevinLieser 我对触觉反馈和 AVFoundation 也有问题!
      【解决方案4】:

      对于那些在AVFoundation苦苦挣扎的人,有一个从iOS13开始的方法

      func setAllowHapticsAndSystemSoundsDuringRecording(_ inValue: Bool) throws
      

      您可以在从音频输入录制时启用系统声音和触觉播放。

      Reference

      【讨论】:

        【解决方案5】:

        对于那些使用AVFoundation但不使用触觉的人,我找到了一个简单的方法让触觉同时与AVFoundation一起工作:

        func yourAVRecording() {
            // Haptic
            let generator = UISelectionFeedbackGenerator()
            generator.prepare()
            generator.selectionChanged()
        
            // Record after played Haptic (just give few time to let haptic done and then magic happen)
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
                // Do your AVFoundation stuffs whatever here
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-07
          • 2011-04-18
          • 1970-01-01
          • 1970-01-01
          • 2017-11-30
          • 2016-06-17
          • 2016-09-14
          相关资源
          最近更新 更多