From 7fc86dded3ce4c63f6624fb519685beda806602c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=3D=3FUTF-8=3Fq=3F=3DE9=3D9A=3D90=3DE9=3DA3=3D8E=3F=3D?= Date: Thu, 25 Jun 2015 06:00:02 -0700 Subject: [PATCH] [Image] Add scale support for base64-encoded image. Summary: Fix issue #1136 Closes https://github.com/facebook/react-native/pull/1721 Github Author: =?UTF-8?q?=E9=9A=90=E9=A3=8E?= Test Plan: Imported from GitHub, without a `Test Plan:` line. --- React/Base/RCTConvert.m | 22 +++++++++++++++++----- React/Views/RCTTabBarItem.h | 2 +- React/Views/RCTTabBarItem.m | 4 ++-- React/Views/RCTTabBarItemManager.m | 2 +- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/React/Base/RCTConvert.m b/React/Base/RCTConvert.m index 228447280..8461db3e9 100644 --- a/React/Base/RCTConvert.m +++ b/React/Base/RCTConvert.m @@ -635,17 +635,24 @@ RCT_CGSTRUCT_CONVERTER(CGAffineTransform, (@[ return nil; } - if (RCT_DEBUG && ![json isKindOfClass:[NSString class]]) { + if (RCT_DEBUG && ![json isKindOfClass:[NSString class]] && ![json isKindOfClass:[NSDictionary class]]) { RCTLogConvertError(json, "an image"); return nil; } - if ([json length] == 0) { - return nil; + UIImage *image; + NSString *path; + CGFloat scale = 0.0; + if ([json isKindOfClass:[NSString class]]) { + if ([json length] == 0) { + return nil; + } + path = json; + } else { + path = [self NSString:json[@"uri"]]; + scale = [self CGFloat:json[@"scale"]]; } - UIImage *image = nil; - NSString *path = json; if ([path hasPrefix:@"data:"]) { NSURL *url = [NSURL URLWithString:path]; NSData *imageData = [NSData dataWithContentsOfURL:url]; @@ -658,6 +665,11 @@ RCT_CGSTRUCT_CONVERTER(CGAffineTransform, (@[ image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:path ofType:nil]]; } } + + if (scale > 0) { + image = [UIImage imageWithCGImage:image.CGImage scale:scale orientation:image.imageOrientation]; + } + // NOTE: we don't warn about nil images because there are legitimate // case where we find out if a string is an image by using this method return image; diff --git a/React/Views/RCTTabBarItem.h b/React/Views/RCTTabBarItem.h index 0e2433c3c..8fe6d8efb 100644 --- a/React/Views/RCTTabBarItem.h +++ b/React/Views/RCTTabBarItem.h @@ -11,7 +11,7 @@ @interface RCTTabBarItem : UIView -@property (nonatomic, copy) NSString *icon; +@property (nonatomic, copy) id icon; @property (nonatomic, assign, getter=isSelected) BOOL selected; @property (nonatomic, readonly) UITabBarItem *barItem; diff --git a/React/Views/RCTTabBarItem.m b/React/Views/RCTTabBarItem.m index e6caa0b18..6855c1410 100644 --- a/React/Views/RCTTabBarItem.m +++ b/React/Views/RCTTabBarItem.m @@ -25,7 +25,7 @@ return _barItem; } -- (void)setIcon:(NSString *)icon +- (void)setIcon:(id)icon { static NSDictionary *systemIcons; static dispatch_once_t onceToken; @@ -54,7 +54,7 @@ UIImage *image = [RCTConvert UIImage:_icon]; UITabBarItem *oldItem = _barItem; if (image) { - + // Recreate barItem if previous item was a system icon if (wasSystemIcon) { _barItem = nil; diff --git a/React/Views/RCTTabBarItemManager.m b/React/Views/RCTTabBarItemManager.m index cdfa8669c..d1a96ef2a 100644 --- a/React/Views/RCTTabBarItemManager.m +++ b/React/Views/RCTTabBarItemManager.m @@ -22,7 +22,7 @@ RCT_EXPORT_MODULE() } RCT_EXPORT_VIEW_PROPERTY(selected, BOOL); -RCT_EXPORT_VIEW_PROPERTY(icon, NSString); +RCT_EXPORT_VIEW_PROPERTY(icon, id); RCT_REMAP_VIEW_PROPERTY(selectedIcon, barItem.selectedImage, UIImage); RCT_REMAP_VIEW_PROPERTY(badge, barItem.badgeValue, NSString); RCT_CUSTOM_VIEW_PROPERTY(title, NSString, RCTTabBarItem)