From e7332f1db138f220a7ff7b43ca5901d8c391873a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E5=B0=9A=E6=98=86?= Date: Tue, 19 Jul 2022 16:40:41 +0800 Subject: [PATCH] fix: image's contentMode bug when displayed again after an image loading error. --- doric-iOS/Pod/Classes/Shader/DoricImageNode.m | 54 +++++++++---------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/doric-iOS/Pod/Classes/Shader/DoricImageNode.m b/doric-iOS/Pod/Classes/Shader/DoricImageNode.m index 454e5787..d7f59432 100644 --- a/doric-iOS/Pod/Classes/Shader/DoricImageNode.m +++ b/doric-iOS/Pod/Classes/Shader/DoricImageNode.m @@ -75,7 +75,6 @@ @implementation DoricImageView @interface DoricImageNode () @property(nonatomic, copy) NSString *loadCallbackId; @property(nonatomic, copy) NSString *animationEndCallbackId; -@property(nonatomic, assign) UIViewContentMode contentMode; @property(nonatomic, strong) NSNumber *placeHolderColor; @property(nonatomic, strong) NSString *placeHolderImage; @property(nonatomic, strong) NSString *placeHolderImageBase64; @@ -163,7 +162,6 @@ - (UIImage *)currentPlaceHolderImage { UIColor *color = DoricColor(self.placeHolderColor); CGRect rect = CGRectMake(0, 0, 1, 1); self.view.contentMode = UIViewContentModeScaleToFill; - self.scaleType = 0; if (@available(iOS 10.0, *)) { UIGraphicsImageRendererFormat *format = [[UIGraphicsImageRendererFormat alloc] init]; format.scale = [UIScreen mainScreen].scale; @@ -219,7 +217,6 @@ - (UIImage *)currentErrorImage { UIColor *color = DoricColor(self.errorColor); CGRect rect = CGRectMake(0, 0, 1, 1); self.view.contentMode = UIViewContentModeScaleToFill; - self.scaleType = 0; if (@available(iOS 10.0, *)) { UIGraphicsImageRendererFormat *format = [[UIGraphicsImageRendererFormat alloc] init]; format.scale = [UIScreen mainScreen].scale; @@ -248,7 +245,6 @@ - (UIImage *)currentErrorImage { UIColor *color = UIColor.clearColor; CGRect rect = CGRectMake(0, 0, 1, 1); self.view.contentMode = UIViewContentModeScaleToFill; - self.scaleType = 0; if (@available(iOS 10.0, *)) { UIGraphicsImageRendererFormat *format = [[UIGraphicsImageRendererFormat alloc] init]; format.scale = [UIScreen mainScreen].scale; @@ -336,9 +332,6 @@ - (void)blendView:(UIImageView *)view forPropName:(NSString *)name propValue:(id [view yy_setImageWithURL:[NSURL URLWithString:prop] placeholder:image options:0 completion:^(UIImage *image, NSURL *url, YYWebImageFromType from, YYWebImageStage stage, NSError *error) { __strong typeof(_self) self = _self; - if (self.placeHolderColor || self.errorColor) { - self.view.contentMode = self.contentMode; - } self.view.doricLayout.undefined = NO; if (error) { [[self currentErrorImage] also:^(UIImage *it) { @@ -348,6 +341,7 @@ - (void)blendView:(UIImageView *)view forPropName:(NSString *)name propValue:(id [self callJSResponse:self.loadCallbackId, nil]; } } else if (image && stage == YYWebImageStageFinished) { + [self updateScaleType]; if (image.scale != self.imageScale) { if ([image isKindOfClass:YYImage.class] && ((YYImage *) image).animatedImageData != nil) { image = [YYImage imageWithData:((YYImage *) image).animatedImageData scale:self.imageScale]; @@ -383,9 +377,6 @@ - (void)blendView:(UIImageView *)view forPropName:(NSString *)name propValue:(id progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { __strong typeof(_self) self = _self; - if (self.placeHolderColor || self.errorColor) { - self.view.contentMode = self.contentMode; - } self.view.doricLayout.undefined = NO; if (error) { [[self currentErrorImage] also:^(UIImage *it) { @@ -395,6 +386,7 @@ - (void)blendView:(UIImageView *)view forPropName:(NSString *)name propValue:(id [self callJSResponse:self.loadCallbackId, nil]; } } else { + [self updateScaleType]; if (self.loadCallbackId.length > 0) { [self callJSResponse:self.loadCallbackId, @{ @@ -419,25 +411,7 @@ - (void)blendView:(UIImageView *)view forPropName:(NSString *)name propValue:(id async = YES; } else if ([@"scaleType" isEqualToString:name]) { self.scaleType = [prop integerValue]; - switch (self.scaleType) { - case 1: { - self.view.contentMode = UIViewContentModeScaleAspectFit; - break; - } - case 2: { - self.view.contentMode = UIViewContentModeScaleAspectFill; - break; - } - case 3: { // image tile - self.view.contentMode = UIViewContentModeScaleToFill; - break; - } - default: { - self.view.contentMode = UIViewContentModeScaleToFill; - break; - } - } - self.contentMode = self.view.contentMode; + [self updateScaleType]; } else if ([@"loadCallback" isEqualToString:name]) { // Do not need set } else if ([@"imageBase64" isEqualToString:name]) { @@ -729,6 +703,28 @@ - (void)resizingImageIfNeeded { } } +- (void)updateScaleType { + if (!self.view) return; + switch (self.scaleType) { + case 1: { + self.view.contentMode = UIViewContentModeScaleAspectFit; + break; + } + case 2: { + self.view.contentMode = UIViewContentModeScaleAspectFill; + break; + } + case 3: { // image tile + self.view.contentMode = UIViewContentModeScaleToFill; + break; + } + default: { + self.view.contentMode = UIViewContentModeScaleToFill; + break; + } + } +} + - (NSNumber *)isAnimating { if (self.view.animating) { return @(YES);