Представление IMessage MSSticker, созданное из неправильного размера UIView

Привет, я борюсь с этим уже пару дней и не могу найти никакой документации за пределами стандартных представлений сетки для MSStickerView размеры

Я работаю над приложением, которое создает MSStickerViews динамически - он делает это путем преобразования 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, похоже, показывают, что наклейки создаются из путей к файлам и не изменяются в размер при переходе между перетаскиванием и падением - любая помощь будет оценена!

1 ответ

Решение

В конце концов я исправил эту проблему, получив кадр из представления, которое я копировал, а затем вызвал 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, поэтому в момент инициализации перетаскивания был реализован реальный размер стикера (который отличался от размера кадра / автолайта, который я использовал. на мой взгляд)

Другие вопросы по тегам