从 UIView 不正确的大小创建的 IMessage MSSticker 视图

IMessage MSSticker view created from UIView incorrect sizing

嘿,我已经为此苦苦挣扎了几天,似乎找不到 MSStickerView 尺寸

的标准网格视图之外的任何文档

我正在开发一个动态创建 MSStickerViews 的应用程序 - 它通过将 UIView 转换为 UIImage 将其保存到磁盘然后传递 URL 来实现MSSticker 在创建 MSStickerView 框架之前将其设置为原始视图的大小。

我遇到的问题是,当我将 MSStickerView 拖到消息 window 中时,MSStickerView 在被拖动时会缩小 - 然后当拖放到消息 [=36= 中时],尺寸变大。我不知道如何控制拖动时的大小或最终图像大小

这是我从视图创建图像的代码

extension UIView {
    func imageFromView() -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.isOpaque, 0.0)
           defer { UIGraphicsEndImageContext() }
           if let context = UIGraphicsGetCurrentContext() {
               self.layer.render(in: context)
               let image = UIGraphicsGetImageFromCurrentImageContext()

               return image
           }
           return nil
       }
}

这是将其保存到磁盘的代码

extension UIImage {
    func savedPath(name: String) -> URL{
        let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        let filePath = "\(paths[0])/name.png"
        let url = URL(fileURLWithPath: filePath)
        // Save image.
        if let data = self.pngData() {
            do {
                try data.write(to: url)
            } catch let error as NSError {

            }
        }
        return url
    }
}

最后是将数据路径转换为贴纸的代码

if let stickerImage = backgroundBox.imageFromView() {
        let url = stickerImage.savedPath(name: textBox.text ?? "StickerMCSticker")
        if let msSticker = try? MSSticker(contentsOfFileURL: url, localizedDescription: "") {

            var newFrame = self.backgroundBox.frame
            newFrame.size.width = newFrame.size.width
            newFrame.size.height = newFrame.size.height

            let stickerView = MSStickerView(frame: newFrame, sticker: msSticker)

            self.view.addSubview(stickerView)
            print("** sticker frame \(stickerView.frame)")
            self.sticker = stickerView
        }
    }

我首先想知道我是否需要对视网膜尺寸做些什么,但是在文件中添加 @2x 只会破坏图像 - 所以我坚持这个 - WWDC 会议似乎显示了从文件创建的贴纸路径并且在拖放之间的过渡中不改变大小 - 任何帮助将不胜感激!

我最终解决了这个问题,方法是从我正在复制的框架的视图中获取框架,然后调用 sizeToFit()-

  init(sticker: MSSticker, size: CGSize) {
        let stickerFrame = CGRect(x: 0, y: 0, width: size.width, height: size.height)
        self.sticker = MSStickerView(frame: stickerFrame, sticker: sticker)
        self.sticker.sizeToFit()
        super.init(nibName: nil, bund

因为 StickerView 没有设置正确的大小。本质上,我看到的体验是我视图上的贴纸尺寸与 MSSticker 的尺寸不准确 - 所以在初始化拖动的那一刻,实现了真正的贴纸尺寸(这与我的框架尺寸/自动布局不同)在我看来申请)