1

我正在创建自己的 iMessage 自定义应用程序,我只是想发送一个在 2 个图像之间交换背景的 iMessage,从而产生动画的错觉。我什至不确定这是可能的,但我正在尝试使用下面的代码。此代码仅在收件人收到邮件时显示第一张图片。任何帮助,将不胜感激。

func createImageForMessage() -> UIImage? {
    let cupAnimation = UIImageView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
    let imagesListArray = [UIImage(named: "boy_cup_1_1.png")!,UIImage(named: "boy_cup_1_7.png")!]

    cupAnimation.animationImages = imagesListArray
    cupAnimation.animationDuration = 10.0
    cupAnimation.animationRepeatCount = 50
    cupAnimation.startAnimating()

    let cupBackground = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
    cupBackground.addSubview(cupAnimation)

    background.addSubview(cupBackground)

    background.frame.origin = CGPoint(x: view.frame.size.width, y: view.frame.size.height)

    view.addSubview(background)

    UIGraphicsBeginImageContextWithOptions(background.frame.size, false, UIScreen.main.scale)
    background.drawHierarchy(in: background.bounds, afterScreenUpdates: true)

    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    background.removeFromSuperview()

    return image
}
4

1 回答 1

0

iMessage 的丰富消息扩展有两种:iMessage 应用程序和贴纸包。

  • 当您拥有 iMessage 应用程序时,您在应用程序中创建的自定义消息内容(并通过MSMessage或发送MSSession)只有在收件人也安装了您的 iMessage 应用程序时才能被他们查看。如果他们不这样做,他们会收到您的内容的静态预览,以及一些允许收件人从 App Store 安装您的应用程序的 UI。

  • 当你有一个贴纸包时,创建贴纸图像不需要任何代码——它们只是资产。因此,Apple 的 iMessage 服务可以将这些资产传递给任何设备上的任何人,任何人都可以查看它们,无论他们是否在他们的设备上安装了您的应用程序。(而且不管他们是否可以安装您的应用程序。自定义贴纸应用程序只能安装在 iOS 上,但 macOS 和 watchOS 可以接收贴纸。)

因此,要拥有动画贴纸,您只需要创建动画资产即可。首选格式是APNG,Xcode 支持从 PNG 图像序列自动创建 APNG 动画贴纸 - 只需在编辑器中查找您的xcstickers包。或者按照Apple Developer 网站上有关为 iMessage 创建贴纸的教程和视频进行操作。

请注意,您也可以将两者结合起来——您可以拥有一个 iMessage 应用程序,该应用程序可以动态地为MSSticker班级创建新贴纸并将它们发送给其他用户。在这种情况下,贴纸是动态的,因为您的应用程序在运行时创建它们,但在创建后它们是静态资产,这意味着 iMessage 服务可以分发它们,并且收件人不需要安装您的应用程序来查看它们。

如果您动态创建贴纸,则需要先在应用中编写贴纸资产文件,然后再将其传递给MSSticker类。如果您使用动画图像执行此操作,则可以使用CGImageDestinationAPI 创建 APNG 文件 - 请参阅Apple 的 Image I/O Programming Guide 中的这一点


以上是试图回答您问题的实际主题——在 iMessage 中发送动画贴纸。但是您的代码中也有一些更具体的混淆,所以这里尝试解决这个问题......

您的方法返回一个UIImage. 该类不支持动画,仅支持静态图像。如果你想用动画做任何事情,你需要一些不同的东西来代表一个(如上CGImageDestination所示)。

UIImageView可以通过给定一个s序列呈现动画。但是,当您使用该视图时,您会截取该视图,创建一个静态图像。UIImagedrawHierarchy(in:afterScreenUpdates:)

于 2016-11-10T21:31:51.407 回答