1

嘿,我已经为此苦苦挣扎了几天,似乎在标准网格视图之外找不到任何关于MSStickerView尺寸的文档

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

我遇到的问题是,当我将其MSStickerView拖入消息窗口时,MSStickerView在被拖动时会缩小 - 然后当拖放到消息窗口中时,会变为更大的大小。我不知道如何控制拖动时的大小或最终图像大小

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

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 会话似乎显示贴纸是从文件路径创建的而不是改变拖放之间过渡的大小 - 任何帮助将不胜感激!

4

1 回答 1

0

我最终通过从我正在复制的框架中获取框架然后调用来解决了这个问题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

as the StickerView was not setting the correct size. Essentially the experience I was seeing was that the sticker size on my view was not accurate with the size of the MSSticker - so the moment the drag was initialized, the real sticker size was implemented (which was different to the frame size / autoLayout I was applying in my view)

于 2020-06-15T10:16:15.920 回答