问题描述
使用iOS 14 WidgetKit,我试图显示带有库中“特殊”照片资产的小部件。使用中型窗口小部件,我希望照片资产能够像本地“照片”窗口小部件一样填充整个区域(“纵横填满”)。
struct My_WidgetEntryView : View
{
var entry : Provider.Entry
var body: some View
{
PhotoView(user: 1)
}
}
struct PhotoView: View
{
var user : Int
@ObservedObject private var assetImageModel = AssetImageModel()
init(user: Int)
{
self.user = user
self.assetImageModel.loadAsset()
}
var body: some View {
if self.assetImageModel.assetImage != nil {
Image(uiImage: self.assetImageModel.assetImage!)
.resizable()
} else {
Image(uiImage: UIImage(systemName: "photo")!)
.resizable()
}
}
}
class AssetImageModel: ObservableObject {
@Published var assetImage: UIImage?
init() {
loadAsset()
}
func loadAsset() {
if PHPhotoLibrary.authorizationStatus() == .authorized {
let allPhotosOptions = PHFetchOptions()
allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate",ascending: true)]
let assetsFetchResults = PHAsset.fetchAssets(with: allPhotosOptions)
if assetsFetchResults.count > 0 {
let asset = assetsFetchResults.lastObject
if asset != nil {
let options = PHImageRequestOptions()
options.isSynchronous = true
options.deliveryMode = .highQualityFormat
options.resizeMode = .exact
options.version = .current
PHCachingImageManager().requestImage(for: asset!,targetSize: CGSize(width: 360 * UIScreen.main.scale,height: 170 * UIScreen.main.scale),contentMode: .aspectFill,options: options,resultHandler: { image,_ in
//DispatchQueue.main.async {
self.assetImage = image
//}
})
} else {
//Asset was nil
}
} else {
//No assets
}
} else {
//No persmission
}
}
}
运行上述命令时,出现崩溃,并显示内存警告,指出已超过30 MB内存限制。这显然是由于以下原因:
- 对于中型窗口小部件,我必须缩小360 x 170磅 由于无法在获取之前实际的视图尺寸 视图被显示。
- 然后必须将实际目标尺寸乘以屏幕比例,
目前的测试设备是3倍。
外观填充为填充类型。因此,
PHCachingImageManager
将为肖像照片返回360点宽度和480点高度的高度,以填充视图。图像的最终尺寸最终为1080 x 1440像素大小。我想这就是内存不足的原因。
问题
是否可以要求正确裁剪360 x 170点尺寸的图像? Stock Photos小部件似乎可以解决这个问题。
我尝试过的事情
- 我在
normalizedCropRect
中尝试过PHImageRequestOptions
, 没有运气。 - 将图像尺寸大幅度减小是可行的,但是图像看起来在视觉上是模糊的。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)