使用 iOS 17 脉冲符号效果对 UIBarButtonItem 进行动画处理不起作用(没有 UIImageView)

问题描述 投票:0回答:1

我正在尝试从 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,并且显然没有简单的答案。我宁愿放弃整个效果,也不愿尝试某种拼凑来调整图像视图的大小和重新对齐。

谢谢你。

ios swift uikit ios17 ios-animations
1个回答
0
投票
已解决

我认为这一点也不明显,但是如果将栏按钮项的句柄保存为实例变量,然后仅在视图出现后才启动动画,效果是可见的。

这是工作代码:

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)") } }
    
© www.soinside.com 2019 - 2024. All rights reserved.