关闭 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
我突然想到 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