我正在try 从iOS 17获得新的符号动画,为UIBarButtonItem工作.以下链接的WWDC 2023视频《在你的应用程序中制作符号动画》promise 如下:

First of all, the new UIKit methods on UIImageView are also available on UIBarButtonItem. This makes it easy to bring your toolbars to life using symbol animations.

遗憾的是,视频附带的所有示例代码仅说明了使用UIImageView.我曾try 使用UIImageView作为在初始化时传递给我的UIBarButtonItem的自定义视图作为解决办法,但这也不能正常工作.

需要说明的是,我希望在UIBarButtonItemusing the class's function.上实现该效果

我用故事板做了一个小演示项目.代码如下所示:

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)")
    }
}

据我所知,这应该是我让它工作所需的全部.按钮显示、大小和排列正确,但没有脉动.与苹果promise 的相反,象征效应似乎完全消失了.

有谁知道我哪里出了问题吗?(我希望是我,而不是苹果!)

以下是故事板的截图,仅供参考:

Storyboard screenshot

以下是模拟器的屏幕截图:

Simulator screenshot

我试过在模拟器和实际设备上运行这个程序,但没有成功.按钮没有脉动.

顺便说一句,使用图像视图作为自定义视图将产生一个脉冲按钮.然而,对于工具栏中的其他按钮,使用自定义视图的按钮既没有正确排列,也没有适当的大小,when running on an iOS device.(奇怪的是,它在模拟器中看起来很好!)这似乎是一个已知的长期问题,可以一直追溯到iOS 11,显然没有简单的答案.我宁愿放弃整个效果,也不愿try 某种杂乱无章的方式来调整图像视图的大小和重新排列.

谢谢.

推荐答案

已解决

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

以下是工作代码:

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) {
        super.viewDidAppear(animated)
        
        // 已解决: Start the animation after the view appears.
        button?.addSymbolEffect(.pulse, options: .repeating, animated: true)
    }
    
    @objc func sayHello(_ sender: UIBarButtonItem) {
        print("Hello: \(sender)")
    }
}

Ios相关问答推荐

AlGolia InstantSearch Swift Package Manager引发编译错误

Nomb iOS 17.4.0中崩溃

如何使视图完全适合屏幕,而不会在旋转时溢出手机屏幕的边界?

在某些情况下,UIHostingController在自动调整时不能调整大小

SwiftUI绑定到特定的一个或多个枚举 case

Swift在SceneKit中为scnnode添加自定义几何体(视图)

IOS-获取本地化系统映像

如何在iOS 17 SwiftUI中获取用户名

多协议和类继承混乱,Swift

创建 Flutter 项目时,如何从我的系统中删除特定的开发者身份?

Apple Metal iOS 为什么 GLKMatrix4MakeLookAt 来回摇摆

为什么这个 SwiftUI 状态在作为非绑定参数传递时没有更新?

如何为 XCTest、SwiftUI 预览等初始化带有 @MainActor 注释的 Swift 类

SwiftUI 中的描边图像边框

react 在 android 上运行的本机应用程序,但在 iOS 上出现问题,详细信息在描述中共享

具有多个目标的应用程序的动态内容

在向我的 struct 添加属性后获取线程 10:EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

判断Apple LiveText是否可用?

Swift:调用中缺少参数标签xxx

如何缩小 UIImage 并使其同时变得清晰/锐利而不是模糊?