iOS 14 WidgetKit内存问题-照片资产尺寸

问题描述

使用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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...