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