SwiftUI的滑块会频繁触发触觉反馈

移动开发 2026-07-09

我正在尝试实现一个带有步骤的SwiftUI Slider,但在滑块到达任一端时,触觉反馈会被重复触发,遇到了一个问题。

这在苹果官方文档中的示例也会出现同样的问题:
https://developer.apple.com/documentation/swiftui/slider

我是在iOS 26、Xcode 26.5上进行测试的。

还有人遇到过这种行为吗?有没有办法在滑块移动到最小值或最大值时防止触觉反馈被频繁触发?

要重现这个问题:

struct ContentView: View {
    @State private var speed = 50.0

    var body: some View {
        Slider(
            value: $speed,
            in: 0...100,
            step: 5
        )
    }
}

解决方案

基于你的代码并在搭载iOS 26.5、Xcode 26.5的实际iPhone上测试,我发现问题可以通过两种方式复现:

  • 按住滑块末端的拇指,直到触发触觉反馈的点(这很容易复现)
  • 进行惯性滑动(并不是每次都会发生)

我认为问题可能是由于交互导致拇指按钮大小变化的方式所致。这会导致底层数值出现微小的变化。我在帖子 Slider value twitches when thumb button is released (iOS 26) 中也报告了这个问题的另一个症状。

添加刻度到滑块似乎可以解决这个问题。

一些说明:

  • 只需为 Slider 定义一个标签(label),再加上一个 step 参数,即可添加刻度线。据我所知,是否需要定义标签并未在文档中明确提及。
  • 默认情况下,即使定义了标签,滑块的标签也会被隐藏(有关更多信息,请参见 [SwiftUI Slider's label visibility])。不过,如果你发现它被显示并且你想保持隐藏,可以使用修饰符 .labelsHidden()
  • 添加刻度线也会使拇指按钮对齐到步长位置(如果不显示刻度则不会发生),并在每个步长处触发触觉反馈。
  • 当步长非常小时,刻度线会合并成一条实线。不过即使在这种情况下,也有助于防止问题的发生。

下面是将示例更新为显示刻度线的做法。你已经使用步长为5 的设置——这会让刻度标记彼此之间有间距,即使增加了填充以让滑块远离屏幕边缘:

Slider(
    value: $speed,
    in: 0...100,
    step: 5
) {
    Text("Speed")
}
// .labelsHidden() // if necessary
.padding()
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章