关闭 UISwitch 动画

Turn off UISwitch animations

我突然想到 iOS 默认应用程序中的切换开关感觉更快捷。看起来动画刚刚关闭。

是否有更改 UISwitch 上此行为的设置?

这似乎并不能解决问题:

UISwitch.setAnimationsEnabled(enabled: false)

我认为这个问题没有优雅的解决方案,但我发现了一个实际可行的 hacky 解决方案。

UISwitch 有一个子视图,它附有 2 个手势识别器:一个用于长按,一个用于平移。如果您将 UISwitch 子类化,删除这些手势识别器并在初始化后立即添加一个新的,您可以实现非动画行为。

请记住,此解决方案可能无法在未来的 iOS 版本中使用,因为此解决方案所依赖的内部实现可能会发生变化。

这是对我有用的代码片段:

class PTSwitch: UISwitch {

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    let firstSubview = subviews[0]

    guard let gestureRecognizers = firstSubview.gestureRecognizers else {
        return
    }

    for recognizer in gestureRecognizers {
        firstSubview.removeGestureRecognizer(recognizer)
    }

    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(gestureRecognized))
    firstSubview.addGestureRecognizer(tapGestureRecognizer)
}

@objc func gestureRecognized() {
    setOn(!isOn, animated: false)
}

}

如您所见,我删除了内置手势识别器并添加了点击手势识别器。您还可以添加另一个用于平移手势识别,它也应该可以工作。然后在手势识别器的回调函数中,我简单地使用了 UISwitch 的 setOn 函数和 animated: false 来禁用动画。

I'm still wondering why Apple silently removed the animations in their system apps. – nontomatic

iOS 默认应用中的许多区域都没有动画 UISwitch - On/Off 按钮,例如

  • Wi-Fi,个人热点,在Settings.app

  • 设置闹钟Clock.app

这里是断开的开/关按钮动画,例如

  • Settings.app
  • 下的粗体文本(激活选项,然后出现一条消息并点击取消)
  • 打开 App Store.app 创建 Apple ID 并确认使用条款
  • 还有更多领域...

在我的 iPad 9.7、iPhone 5S 和 iPhone XS Max 上 iOS 12.2 可重现。这是自 iOS 7 以来的错误,Apple 从未为 iOS 默认应用程序修复此问题。

许多第三方应用程序接管了相同的错误,因为从 iOS 7 到今天,它从未得到妥善修复。开发人员始终必须自己检查并在他们的应用程序中修复它(或由用户发现)。 对于特殊工艺,例如开/关按钮接管许多功能的情况会更糟。许多动画(自 iOS 7)已损坏。

注意!! 在 iOS 6 (iPhone 5)、iOS 5 (iPhone 4S) 中,UISwitch 没有问题 - On/Off 按钮动画(没有损坏)在 iOS 默认应用程序。所有第三方应用也没有这些问题,当时是在这个iOS版本下开发的。

在 UISwitch 上,您可以使用动画参数 = false 调用 setOn