@@ -103,6 +103,7 @@ - (void)initSubviews {
103103 [self .topToolBarView addSubview: self .checkboxButton];
104104
105105 _progressView = [[QMUIPieProgressView alloc ] init ];
106+ self.progressView .tintColor = self.toolBarTintColor ;
106107 self.progressView .hidden = YES ;
107108 [self .topToolBarView addSubview: self .progressView];
108109
@@ -331,17 +332,25 @@ - (void)requestImageForZoomImageView:(QMUIZoomImageView *)zoomImageView withInde
331332 };
332333
333334 if (imageAsset.assetType == QMUIAssetTypeLivePhoto) {
335+ imageView.tag = -1 ;
334336 imageAsset.requestID = [imageAsset requestLivePhotoWithCompletion: ^void (PHLivePhoto *result, NSDictionary *info) {
335- // 如果是走 PhotoKit 的逻辑,那么这个 block 会被多次调用,并且第一次调用时返回的图片是一张小图,
336- // 这时需要把图片放大到跟屏幕一样大,避免后面加载大图后图片的显示会有跳动
337- if (_usePhotoKit && [info[PHLivePhotoInfoIsDegradedKey] boolValue ]) {
338- imageView.contentMode = UIViewContentModeScaleAspectFit;
339- } else {
340- imageView.contentMode = UIViewContentModeCenter;
337+ // 这里可能因为 imageView 复用,导致前面的请求得到的结果显示到别的 imageView 上,
338+ // 因此判断如果是新请求(无复用问题)或者是当前的请求才把获得的图片结果展示出来
339+ BOOL isNewRequest = (imageView.tag == -1 && imageAsset.requestID == 0 );
340+ BOOL isCurrentRequest = imageView.tag == imageAsset.requestID ;
341+ BOOL loadICloudImageFault = !result || info[PHImageErrorKey];
342+ BOOL isDegradedImage = [info[PHImageResultIsDegradedKey] boolValue ]; // 是否为低清图
343+ if (!loadICloudImageFault && (isNewRequest || isCurrentRequest)) {
344+ // 如果是走 PhotoKit 的逻辑,那么这个 block 会被多次调用,并且第一次调用时返回的图片是一张小图,
345+ // 这时需要把图片放大到跟屏幕一样大,避免后面加载大图后图片的显示会有跳动
346+ if (isDegradedImage || loadICloudImageFault) {
347+ imageView.contentMode = UIViewContentModeScaleAspectFit;
348+ } else {
349+ imageView.contentMode = UIViewContentModeCenter;
350+ }
351+ imageView.livePhoto = result;
341352 }
342353
343- imageView.livePhoto = result;
344-
345354 BOOL downlaodSucceed = (result && !info) || (![[info objectForKey: PHLivePhotoInfoCancelledKey] boolValue ] && ![info objectForKey: PHLivePhotoInfoErrorKey] && ![[info objectForKey: PHLivePhotoInfoIsDegradedKey] boolValue ]);
346355
347356 if (downlaodSucceed) {
@@ -356,18 +365,27 @@ - (void)requestImageForZoomImageView:(QMUIZoomImageView *)zoomImageView withInde
356365 }
357366
358367 } withProgressHandler: phProgressHandler];
368+ imageView.tag = imageAsset.requestID ;
359369 } else {
370+ imageView.tag = -1 ;
360371 imageAsset.requestID = [imageAsset requestPreviewImageWithCompletion: ^void (UIImage *result, NSDictionary *info) {
361- // 如果是走 PhotoKit 的逻辑,那么这个 block 会被多次调用,并且第一次调用时返回的图片是一张小图,
362- // 这时需要把图片放大到跟屏幕一样大,避免后面加载大图后图片的显示会有跳动
363- if (_usePhotoKit && [info[PHImageResultIsDegradedKey] boolValue ]) {
364- imageView.contentMode = UIViewContentModeScaleAspectFit;
365- } else {
366- imageView.contentMode = UIViewContentModeCenter;
372+ // 这里可能因为 imageView 复用,导致前面的请求得到的结果显示到别的 imageView 上,
373+ // 因此判断如果是新请求(无复用问题)或者是当前的请求才把获得的图片结果展示出来
374+ BOOL isNewRequest = (imageView.tag == -1 && imageAsset.requestID == 0 );
375+ BOOL isCurrentRequest = imageView.tag == imageAsset.requestID ;
376+ BOOL loadICloudImageFault = !result || info[PHImageErrorKey];
377+ BOOL isDegradedImage = [info[PHImageResultIsDegradedKey] boolValue ]; // 是否为低清图
378+ if (!loadICloudImageFault && (isNewRequest || isCurrentRequest)) {
379+ // 如果是走 PhotoKit 的逻辑,那么这个 block 会被多次调用,并且第一次调用时返回的图片是一张小图,
380+ // 这时需要把图片放大到跟屏幕一样大,避免后面加载大图后图片的显示会有跳动
381+ if (isDegradedImage || loadICloudImageFault) {
382+ imageView.contentMode = UIViewContentModeScaleAspectFit;
383+ } else {
384+ imageView.contentMode = UIViewContentModeCenter;
385+ }
386+ imageView.image = result;
367387 }
368388
369- imageView.image = result;
370-
371389 BOOL downlaodSucceed = (result && !info) || (![[info objectForKey: PHImageCancelledKey] boolValue ] && ![info objectForKey: PHImageErrorKey] && ![[info objectForKey: PHImageResultIsDegradedKey] boolValue ]);
372390
373391 if (downlaodSucceed) {
@@ -382,6 +400,7 @@ - (void)requestImageForZoomImageView:(QMUIZoomImageView *)zoomImageView withInde
382400 }
383401
384402 } withProgressHandler: phProgressHandler];
403+ imageView.tag = imageAsset.requestID ;
385404 }
386405}
387406
0 commit comments