首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从UIView创建的IMessage MSSticker视图大小不正确

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

Stack Overflow用户
提问于 2020-03-20 21:02:53
回答 1查看 95关注 0票数 1

嘿,我已经在这个问题上挣扎了几天,除了标准的MSStickerView大小的网格视图之外,似乎找不到任何文档

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

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

下面是我从视图创建图像的代码

代码语言:javascript
复制
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
       }
}

下面是将此文件保存到磁盘的代码

代码语言:javascript
复制
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
    }
}

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

代码语言:javascript
复制
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会话似乎显示了从文件路径创建的贴纸,并且在拖放之间的过渡中大小没有改变-任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-15 18:16:16

我最终修复了这个问题,从我正在复制的视图中获取帧,然后调用sizeToFit()-

代码语言:javascript
复制
  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的大小不一致--所以在拖动初始化的那一刻,实现了真正的贴纸大小(这与我在视图中应用的帧大小/ autoLayout不同)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60774745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档