mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
5c202cafd6
Summary: Changelog: [internal] To avoid typecasting, let's return `UIViewContentMode`. This way we get rid of a condition to check if contentMode is repeat. Reviewed By: JoshuaGross Differential Revision: D26252431 fbshipit-source-id: 94ef7af1a76f13c91b696d57ceecc2453bbc9d8d
116 lines
3.3 KiB
Objective-C
116 lines
3.3 KiB
Objective-C
/*
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#import <UIKit/UIKit.h>
|
|
|
|
#import <React/RCTImageLoader.h>
|
|
#import <react/renderer/imagemanager/primitives.h>
|
|
|
|
using namespace facebook::react;
|
|
|
|
inline static UIViewContentMode RCTContentModeFromImageResizeMode(ImageResizeMode imageResizeMode)
|
|
{
|
|
switch (imageResizeMode) {
|
|
case ImageResizeMode::Cover:
|
|
return UIViewContentModeScaleAspectFill;
|
|
case ImageResizeMode::Contain:
|
|
return UIViewContentModeScaleAspectFit;
|
|
case ImageResizeMode::Stretch:
|
|
return UIViewContentModeScaleToFill;
|
|
case ImageResizeMode::Center:
|
|
return UIViewContentModeCenter;
|
|
case ImageResizeMode::Repeat:
|
|
// Repeat resize mode is handled by the UIImage. Use scale to fill
|
|
// so the repeated image fills the UIImageView.
|
|
return UIViewContentModeScaleToFill;
|
|
}
|
|
}
|
|
|
|
inline std::string toString(const ImageResizeMode &value)
|
|
{
|
|
switch (value) {
|
|
case ImageResizeMode::Cover:
|
|
return "cover";
|
|
case ImageResizeMode::Contain:
|
|
return "contain";
|
|
case ImageResizeMode::Stretch:
|
|
return "stretch";
|
|
case ImageResizeMode::Center:
|
|
return "center";
|
|
case ImageResizeMode::Repeat:
|
|
return "repeat";
|
|
}
|
|
}
|
|
|
|
inline static NSURL *NSURLFromImageSource(const ImageSource &imageSource)
|
|
{
|
|
// `NSURL` has a history of crashing with bad input, so let's be safe.
|
|
@try {
|
|
NSString *urlString = [NSString stringWithCString:imageSource.uri.c_str() encoding:NSASCIIStringEncoding];
|
|
|
|
if (!imageSource.bundle.empty()) {
|
|
NSString *bundle = [NSString stringWithCString:imageSource.bundle.c_str() encoding:NSASCIIStringEncoding];
|
|
urlString = [NSString stringWithFormat:@"%@.bundle/%@", bundle, urlString];
|
|
}
|
|
|
|
NSURL *url = [[NSURL alloc] initWithString:urlString];
|
|
|
|
if (url.scheme) {
|
|
// Well-formed absolute URL.
|
|
return url;
|
|
}
|
|
|
|
if ([urlString rangeOfString:@":"].location != NSNotFound) {
|
|
// The URL has a scheme.
|
|
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
|
|
url = [NSURL URLWithString:urlString];
|
|
return url;
|
|
}
|
|
|
|
// Assume that it's a local path.
|
|
urlString = [urlString stringByRemovingPercentEncoding];
|
|
|
|
if ([urlString hasPrefix:@"~"]) {
|
|
// Path is inside user directory.
|
|
urlString = [urlString stringByExpandingTildeInPath];
|
|
} else {
|
|
if (![urlString isAbsolutePath]) {
|
|
// Assume it's a resource path.
|
|
urlString = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:urlString];
|
|
}
|
|
}
|
|
|
|
url = [NSURL fileURLWithPath:urlString];
|
|
|
|
return url;
|
|
} @catch (__unused NSException *exception) {
|
|
return nil;
|
|
}
|
|
}
|
|
|
|
inline static NSURLRequest *NSURLRequestFromImageSource(const ImageSource &imageSource)
|
|
{
|
|
NSURL *url = NSURLFromImageSource(imageSource);
|
|
|
|
if (!url) {
|
|
RCTLogError(@"URI parsing error.");
|
|
return nil;
|
|
}
|
|
|
|
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
|
|
|
|
/*
|
|
// TODO(shergin): To be implemented.
|
|
request.HTTPBody = ...;
|
|
request.HTTPMethod = ...;
|
|
request.cachePolicy = ...;
|
|
request.allHTTPHeaderFields = ...;
|
|
*/
|
|
|
|
return [request copy];
|
|
}
|