我正在尝试从 iOS 17 获取适用于 UIBarButtonItem 的新符号动画。下面链接的 WWDC 2023 视频“在您的应用程序中为符号添加动画”承诺如下:
首先,UIImageView 上的新 UIKit 方法也可以在 UIBarButtonItem 上使用。这使得使用符号动画可以轻松地让您的工具栏变得栩栩如生。
不幸的是,视频附带的所有示例代码仅说明了如何使用 UIImageView。我尝试使用 UIImageView 作为在初始化时传递给 UIBarButtonItem 的自定义视图作为解决方法,但这也不起作用。
要明确的是,我想使用类的函数在 UIBarButtonItem 上获得效果。
我使用故事板制作了一个小型演示项目。代码如下所示:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let config = UIImage.SymbolConfiguration(scale: UIImage.SymbolScale.large)
let image = UIImage(systemName: "playpause.fill", withConfiguration: config)
let resumeButton =
UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(sayHello))
resumeButton.addSymbolEffect(.pulse, options: .repeating, animated: true)
resumeButton.isSymbolAnimationEnabled = true
toolbarItems = [resumeButton]
}
@objc func sayHello(_ sender: UIBarButtonItem) {
print("Hello: \(sender)")
}
}
据我所知,这应该是我让它工作所需的全部。按钮出现,尺寸和排列正确,但不闪烁。符号效应似乎完全消失了,与苹果所承诺的相反。有人知道我哪里出了问题吗? (我希望是我而不是苹果!)
为了了解更多背景信息,这里是故事板的屏幕截图:
这是模拟器的屏幕截图:
我尝试在模拟器和实际设备上运行它,但没有成功。按钮没有脉冲。
顺便说一句,使用图像视图作为自定义视图将导致按钮闪烁。然而,相对于工具栏中的其他按钮,使用自定义视图的按钮既不能正确排列,也不能正确调整大小,
在 iOS 设备上运行时。(奇怪的是,它在模拟器中看起来很好!)这似乎这是一个已知且长期存在的问题,可以追溯到 iOS 11,并且显然没有简单的答案。我宁愿放弃整个效果,也不愿尝试某种拼凑来调整图像视图的大小和重新对齐。
谢谢你。
我认为这一点也不明显,但是如果将栏按钮项的句柄保存为实例变量,然后仅在视图出现后才启动动画,效果是可见的。
这是工作代码:
import UIKit
class ViewController: UIViewController {
var button: UIBarButtonItem?
override func viewDidLoad() {
super.viewDidLoad()
let config = UIImage.SymbolConfiguration(scale: UIImage.SymbolScale.large)
let image = UIImage(systemName: "playpause.fill", withConfiguration: config)
let resumeButton =
UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(sayHello))
// The animation cannot be started yet…
button = resumeButton
toolbarItems = [resumeButton]
}
override func viewDidAppear(_ animated: Bool) {
// SOLVED: Start the animation after the view appears.
button?.addSymbolEffect(.pulse, options: .repeating, animated: true)
button?.isSymbolAnimationEnabled = true
}
@objc func sayHello(_ sender: UIBarButtonItem) {
print("Hello: \(sender)")
}
}