Skip to content

Commit 5fb20f1

Browse files
committed
fix(ios): fixed transforms not being applied. New animatedImageView property to be set when using animated images
1 parent a128118 commit 5fb20f1

File tree

6 files changed

+67
-33
lines changed

6 files changed

+67
-33
lines changed

plugin/platforms/ios/src/NImage.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44

55
#import "NSImageRoundCornerTransformer.h"
66
#import "NSImageDecodeSizeTransformer.h"
7+
#import "NSImageRoundAsCircleTransformer.h"
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#import <SDWebImage/SDImageTransformer.h>
2+
3+
@interface NSImageRoundAsCircleTransformer: NSObject <SDImageTransformer>
4+
5+
- (nonnull instancetype)init NS_UNAVAILABLE;
6+
+ (nonnull instancetype)transformer;
7+
8+
@end
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#import "NSImageRoundAsCircleTransformer.h"
2+
#import <SDWebImage/SDGraphicsImageRenderer.h>
3+
4+
@interface NSImageRoundAsCircleTransformer ()
5+
6+
@end
7+
8+
@implementation NSImageRoundAsCircleTransformer
9+
+ (instancetype)transformer {
10+
11+
NSImageRoundAsCircleTransformer *transformer = [NSImageRoundAsCircleTransformer new];
12+
return transformer;
13+
}
14+
15+
- (NSString *)transformerKey {
16+
return [NSString stringWithFormat:@"NSImageRoundAsCircleTransformer"];
17+
}
18+
19+
- (UIImage *)transformedImageWithImage:(UIImage *)image forKey:(NSString *)key {
20+
if (!image) {
21+
return nil;
22+
}
23+
24+
CGFloat width = (CGFloat)image.size.width;
25+
CGFloat height = (CGFloat)image.size.height;
26+
CGFloat minwidth = MIN(width, height);
27+
CGFloat cornerRadius = minwidth / 2;
28+
29+
UIImage * resultImage = [image sd_resizedImageWithSize:CGSizeMake(minwidth, minwidth) scaleMode:SDImageScaleModeAspectFill];
30+
resultImage = [resultImage sd_roundedCornerImageWithRadius:cornerRadius corners:UIRectCornerAllCorners borderWidth:0 borderColor:nil];
31+
return resultImage;
32+
// const result = (image as any)
33+
// .sd_resizedImageWithSizeScaleMode(CGSizeMake(minwidth, minwidth), SDImageScaleMode.AspectFill)
34+
// .sd_roundedCornerImageWithRadiusCornersBorderWidthBorderColor(cornerRadius, UIRectCorner.BottomLeft | UIRectCorner.BottomRight | UIRectCorner.TopLeft | UIRectCorner.TopRight, 0, null)
35+
// .sd_resizedImageWithSizeScaleMode(CGSizeMake(width, height), SDImageScaleMode.AspectFit);
36+
// return result;
37+
// return resultImage;
38+
}
39+
40+
@end

src/image-common.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ export class ImageBase extends View {
113113
public aspectRatio: number;
114114
public decodeWidth: number;
115115
public decodeHeight: number;
116+
public animatedImageView: boolean;
116117
alwaysFade: boolean;
117118
noCache: boolean;
118119
// fade: boolean;
@@ -151,6 +152,7 @@ export class ImageBase extends View {
151152

152153

153154
public static clipToBoundsProperty = new Property<ImageBase, boolean>({ name: 'clipToBounds', defaultValue: true, valueConverter: booleanConverter});
155+
public static animatedImageViewProperty = new Property<ImageBase, boolean>({ name: 'animatedImageView', defaultValue: false, valueConverter: booleanConverter});
154156
// public static blendingModeProperty = new Property<ImageBase, string>({ name: 'blendingMode' });
155157

156158
protected handleImageProgress(value: number, totalSize?: number) {}
@@ -255,5 +257,6 @@ ImageBase.decodeHeightProperty.register(ImageBase);
255257
ImageBase.alwaysFadeProperty.register(ImageBase);
256258
ImageBase.noCacheProperty.register(ImageBase);
257259
ImageBase.clipToBoundsProperty.register(ImageBase);
260+
ImageBase.animatedImageViewProperty.register(ImageBase);
258261

259262
// ImageBase.blendingModeProperty.register(ImageBase);

src/image.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,11 @@ export class Img extends View {
194194
* Number value used as the resized image height
195195
*/
196196
decodeHeight: number;
197+
198+
/**
199+
* IOS: if you want to show animated images you need to set this to true
200+
*/
201+
animatedImageView: boolean;
197202
}
198203

199204
/**

src/image.ios.ts

Lines changed: 10 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,6 @@ import { isString } from '@nativescript/core/utils/types';
44
import { RESOURCE_PREFIX, isFileOrResourcePath, isFontIconURI, layout } from '@nativescript/core/utils/utils';
55
import { CLog, CLogTypes, EventData, ImageBase, ImageInfo as ImageInfoBase, ImagePipelineConfigSetting, ScaleType, Stretch } from './image-common';
66

7-
@NativeClass
8-
class SDImageRoundAsCircleTransformer extends NSObject implements SDImageTransformer {
9-
public static ObjCProtocols = [SDImageTransformer];
10-
11-
static transformer() {
12-
const transformer = SDImageRoundAsCircleTransformer.alloc().init();
13-
14-
return transformer;
15-
}
16-
17-
get transformerKey() {
18-
return 'SDImageRoundAsCircleTransformer';
19-
}
20-
21-
transformedImageWithImageForKey(image: UIImage, key: string) {
22-
if (!image) {
23-
return null;
24-
}
25-
const width = image.size.width;
26-
const height = image.size.height;
27-
const minwidth = Math.min(width, height);
28-
const cornerRadius = minwidth / 2;
29-
const result = (image as any)
30-
.sd_resizedImageWithSizeScaleMode(CGSizeMake(minwidth, minwidth), SDImageScaleMode.AspectFill)
31-
.sd_roundedCornerImageWithRadiusCornersBorderWidthBorderColor(cornerRadius, UIRectCorner.BottomLeft | UIRectCorner.BottomRight | UIRectCorner.TopLeft | UIRectCorner.TopRight, 0, null)
32-
.sd_resizedImageWithSizeScaleMode(CGSizeMake(width, height), SDImageScaleMode.AspectFit);
33-
return result;
34-
}
35-
}
36-
377
export class ImageInfo implements ImageInfoBase {
388
constructor(private width: number, private height: number) {}
399

@@ -219,11 +189,11 @@ function getUri(src: string | ImageAsset) {
219189
}
220190

221191
export class Img extends ImageBase {
222-
nativeViewProtected: SDAnimatedImageView;
192+
nativeViewProtected: SDAnimatedImageView | UIImageView;
223193
isLoading = false;
224194
private _imageSourceAffectsLayout: boolean = true;
225195
public createNativeView() {
226-
const result = SDAnimatedImageView.new();
196+
const result = this.animatedImageView? SDAnimatedImageView.new() : UIImageView.new();
227197
result.contentMode = UIViewContentMode.ScaleAspectFit;
228198
result.clipsToBounds = true;
229199
result.userInteractionEnabled = true; // needed for gestures to work
@@ -420,6 +390,7 @@ export class Img extends ImageBase {
420390
}
421391
this.isLoading = true;
422392
let options = SDWebImageOptions.ScaleDownLargeImages | SDWebImageOptions.AvoidAutoSetImage;
393+
423394
if (this.alwaysFade === true) {
424395
options |= SDWebImageOptions.ForceTransition;
425396
}
@@ -438,8 +409,10 @@ export class Img extends ImageBase {
438409
if (this.blurRadius) {
439410
transformers.push(SDImageBlurTransformer.transformerWithRadius(this.blurRadius));
440411
}
412+
console.log('roundAsCircle', this.roundAsCircle, this.style['roundAsCircle']);
441413
if (this.roundAsCircle === true) {
442-
transformers.push(SDImageRoundAsCircleTransformer.new());
414+
//@ts-ignore
415+
transformers.push(NSImageRoundAsCircleTransformer.transformer());
443416
}
444417
if (this.roundBottomLeftRadius || this.roundBottomRightRadius || this.roundTopLeftRadius || this.roundTopRightRadius) {
445418
//@ts-ignore
@@ -450,6 +423,10 @@ export class Img extends ImageBase {
450423
layout.toDeviceIndependentPixels(this.roundBottomLeftRadius)));
451424
}
452425
if (transformers.length > 0) {
426+
if (this.animatedImageView) {
427+
// as we use SDAnimatedImageView all images are loaded as SDAnimatedImage;
428+
options |= SDWebImageOptions.TransformAnimatedImage;
429+
}
453430
context.setValueForKey(SDImagePipelineTransformer.transformerWithTransformers(transformers), SDWebImageContextImageTransformer);
454431
}
455432
this.nativeViewProtected.sd_setImageWithURLPlaceholderImageOptionsContextProgressCompleted(

0 commit comments

Comments
 (0)