我的 iMessage 扩展当前正在根据文本输入生成图像,并将它们作为 MSStickerView 中的贴纸呈现给用户。用户可以通过滑块控制贴纸的大小。 为此,我缩放生成的图像,添加贴纸,然后使用 sizeToFit() 调整 MSStickerView 的大小。
问题在于,StickerView 和 Sticker 显示的尺寸只会减小,而只有在切换 Extension 视图时才会增大(从大到小或反之亦然)。 我知道该视图使用缓存的图像,这就是为什么我使用基于文本输入和大小的名称来保存图像。但是,我期望使用其他一些缓存系统,这会阻止我使用更大的图像。
有没有一种方法可以让我以编程方式触发类似于切换视图时发生的重新加载,或者只是手动调整 MSStickerView 的大小?
func createSticker(_ sender: Any) {
deleteStoredImage(fileName: lastFileName)
// generate a Sticker from the text in the UITextField
var inputText = " "
inputText = textInput.text!
if(inputText.characters.count == 0){
inputText = " "
}
var stickerImage = inputText.image()
stickerImage = resizeImage(image: stickerImage!, targetHeight: CGFloat(sizeSlider.value*150))
// create a unique filename from text+size
let filename = inputText+String(sizeSlider.value)+"Sticker.png"
lastFileName = filename
print("attempting to write file: " + filename)
storeImage(img: stickerImage!, fileName: filename)
// load the recently stored image into an MSSticker
var textSticker: MSSticker!
let url = getDocumentsDirectory().appendingPathComponent(filename)
do {
textSticker = try MSSticker(contentsOfFileURL: url, localizedDescription: "")
} catch {
print(error)
}
// display the sticker in the stickerView and resize/ move it accordingly
stickerView.sticker = textSticker
stickerView.sizeToFit()
stickerView.center = CGPoint(x: stickerContainer.center.x, y: stickerContainer.center.y*0.6)
用户界面图像:
MSSticker
遗憾的是,没有提供确定已加载贴纸文件大小的方法。
要调整
MSStickerView
的大小,使其与贴纸的大小匹配,或者至少与贴纸的宽高比匹配,您可以对 MSSticker
进行子类化,并在初始化时让它读取其图像的尺寸。
MySticker
对象现在有一个size
属性,您可以在需要时读取它。
class MySticker: MSSticker {
private(set) var size = CGSize.zero
override init(contentsOfFileURL fileURL: URL, localizedDescription: String) throws {
try super.init(contentsOfFileURL: fileURL, localizedDescription: localizedDescription)
if let imageSource = CGImageSourceCreateWithURL(fileURL as CFURL, nil) {
if let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as Dictionary? {
let width = imageProperties[kCGImagePropertyPixelWidth] as! Int
let height = imageProperties[kCGImagePropertyPixelHeight] as! Int
size = CGSize(width: width, height: height)
}
}
}
}