blob: 85ab360a6c4429d3fd683df41e5497dafb1ba6c8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#import "WXConvert.h"
#import "WXUtility.h"
#import "WXBoxShadow.h"
#import "WXLength.h"
#import "WXAssert.h"
#import "WXSDKEngine.h"
@implementation WXConvert
#pragma mark Number & String & Collection
#define WX_NUMBER_CONVERT(type, op) \
+ (type)type:(id)value {\
if([value respondsToSelector:@selector(op)]){\
return (type)[value op];\
} else {\
NSString * strval = [NSString stringWithFormat:@"%@",value];\
return (type)[self uint64_t: strval];\
}\
}
WX_NUMBER_CONVERT(BOOL, boolValue)
WX_NUMBER_CONVERT(int, intValue)
WX_NUMBER_CONVERT(short, shortValue)
WX_NUMBER_CONVERT(int64_t, longLongValue)
WX_NUMBER_CONVERT(uint8_t, unsignedShortValue)
WX_NUMBER_CONVERT(uint16_t, unsignedIntValue)
WX_NUMBER_CONVERT(uint32_t, unsignedLongValue)
WX_NUMBER_CONVERT(float, floatValue)
WX_NUMBER_CONVERT(double, doubleValue)
WX_NUMBER_CONVERT(NSInteger, integerValue)
WX_NUMBER_CONVERT(NSUInteger, unsignedIntegerValue)
//unsignedLongLongValue
+ (uint64_t)uint64_t:(id)value {\
NSString * strval = [NSString stringWithFormat:@"%@",value];
unsigned long long ullvalue = strtoull([strval UTF8String], NULL, 10);
return ullvalue;
}
+ (CGFloat)CGFloat:(id)value
{
if ([value isKindOfClass:[NSString class]]) {
NSString *valueString = (NSString *)value;
if ([valueString hasSuffix:@"px"] || [valueString hasSuffix:@"wx"]) {
valueString = [valueString substringToIndex:(valueString.length - 2)];
}
if ([value hasPrefix:@"env(safe-area-inset-"] &&[value hasSuffix:@")"]){
NSUInteger start = [value rangeOfString:@"env(safe-area-inset-"].location +@"env(safe-area-inset-".length;
NSUInteger end = [value rangeOfString:@")" options:NSBackwardsSearch].location;
value = [value substringWithRange:NSMakeRange(start, end-start)];
return [self safeAreaInset:value];
}
return [valueString doubleValue];
}
return [self double:value];
}
+ (CGFloat)flexCGFloat:(id)value
{
if ([value isKindOfClass:[NSString class]]) {
NSString *valueString = (NSString *)value;
if (valueString.length <=0) {
return NAN;
}
if ([valueString hasSuffix:@"px"] || [valueString hasSuffix:@"wx"]) {
valueString = [valueString substringToIndex:(valueString.length - 2)];
}
if ([value hasPrefix:@"env(safe-area-inset-"] &&[value hasSuffix:@")"]){
NSUInteger start = [value rangeOfString:@"env(safe-area-inset-"].location +@"env(safe-area-inset-".length;
NSUInteger end = [value rangeOfString:@")" options:NSBackwardsSearch].location;
value = [value substringWithRange:NSMakeRange(start, end-start)];
return [self safeAreaInset:value];
}
//value maybe not number ,such as 100%
if (![WXConvert checkStringIsRealNum:valueString]) {
return NAN;
}
return [valueString doubleValue];
}
return [self double:value];
}
+ (BOOL)checkStringIsRealNum:(NSString *)checkedNumString {
NSScanner* scan = [NSScanner scannerWithString:checkedNumString];
int intVal;
BOOL isInt = [scan scanInt:&intVal] && [scan isAtEnd];
if (isInt) {
return YES;
}
float floatVal;
BOOL isFloat = [scan scanFloat:&floatVal] && [scan isAtEnd];
if (isFloat) {
return YES;
}
return NO;
}
+ (CGFloat)safeAreaInset:(NSString*)value
{
static NSArray * directionArray = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
directionArray = [NSArray arrayWithObjects:@"top",@"right",@"bottom",@"left", nil];
});
if ([directionArray containsObject:value]) {
__block UIEdgeInsets safeAreaInsets = UIEdgeInsetsZero;
#if __IPHONE_11_0
if (@available(iOS 11.0, *)) {
WXSDKInstance * topInstance = [WXSDKEngine topInstance];
WXPerformBlockSyncOnMainThread(^{
safeAreaInsets = topInstance.rootView.safeAreaInsets;
});
}
#endif
NSUInteger key = [directionArray indexOfObject:value];
CGFloat retValue = 0;
switch (key) {
case 0:
retValue = safeAreaInsets.top;
break;
case 1:
retValue = safeAreaInsets.right;
break;
case 2:
retValue = safeAreaInsets.bottom;
break;
case 3:
retValue = safeAreaInsets.left;
break;
default:
break;
}
return retValue;
}
return 0;
}
+ (NSString *)NSString:(id)value
{
if([value isKindOfClass:[NSString class]]){
return value;
} else if([value isKindOfClass:[NSNumber class]]){
return [((NSNumber *)value) stringValue];
} else if (value != nil) {
WXLogError(@"Convert Error:%@ can not be converted to string", value);
}
return nil;
}
+ (WXPixelType)WXPixelType:(id)value scaleFactor:(CGFloat)scaleFactor
{
CGFloat pixel = [self CGFloat:value];
if ([value isKindOfClass:[NSString class]] && ([value hasSuffix:@"wx"]|| [value hasPrefix:@"env(safe-area-inset-"])) {
return pixel;
}
return pixel * scaleFactor;
}
+ (WXPixelType)WXFlexPixelType:(id)value scaleFactor:(CGFloat)scaleFactor
{
CGFloat pixel = [self flexCGFloat:value];
if ([value isKindOfClass:[NSString class]] && ([value hasSuffix:@"wx"]|| [value hasPrefix:@"env(safe-area-inset-"])) {
return pixel;
}
return pixel * scaleFactor;
}
#pragma mark Style
+ (UIColor *)UIColor:(id)value
{
// 1. check cache
static NSCache *colorCache;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
colorCache = [[NSCache alloc] init];
colorCache.countLimit = 64;
});
if ([value isKindOfClass:[NSNull class]] || !value) {
return nil;
}
UIColor *color = [colorCache objectForKey:value];
if (color) {
return color;
}
// Default color is white
double red = 255, green = 255, blue = 255, alpha = 1.0;
if([value isKindOfClass:[NSString class]]){
// 2. check if is color keyword or transparent
static NSDictionary *knownColors;
static dispatch_once_t onceTokenKnownColors;
dispatch_once(&onceTokenKnownColors, ^{
knownColors = @{
// https://www.w3.org/TR/css3-color/#svg-color
@"aliceblue": @"#f0f8ff",
@"antiquewhite": @"#faebd7",
@"aqua": @"#00ffff",
@"aquamarine": @"#7fffd4",
@"azure": @"#f0ffff",
@"beige": @"#f5f5dc",
@"bisque": @"#ffe4c4",
@"black": @"#000000",
@"blanchedalmond": @"#ffebcd",
@"blue": @"#0000ff",
@"blueviolet": @"#8a2be2",
@"brown": @"#a52a2a",
@"burlywood": @"#deb887",
@"cadetblue": @"#5f9ea0",
@"chartreuse": @"#7fff00",
@"chocolate": @"#d2691e",
@"coral": @"#ff7f50",
@"cornflowerblue": @"#6495ed",
@"cornsilk": @"#fff8dc",
@"crimson": @"#dc143c",
@"cyan": @"#00ffff",
@"darkblue": @"#00008b",
@"darkcyan": @"#008b8b",
@"darkgoldenrod": @"#b8860b",
@"darkgray": @"#a9a9a9",
@"darkgrey": @"#a9a9a9",
@"darkgreen": @"#006400",
@"darkkhaki": @"#bdb76b",
@"darkmagenta": @"#8b008b",
@"darkolivegreen": @"#556b2f",
@"darkorange": @"#ff8c00",
@"darkorchid": @"#9932cc",
@"darkred": @"#8b0000",
@"darksalmon": @"#e9967a",
@"darkseagreen": @"#8fbc8f",
@"darkslateblue": @"#483d8b",
@"darkslategray": @"#2f4f4f",
@"darkslategrey": @"#2f4f4f",
@"darkturquoise": @"#00ced1",
@"darkviolet": @"#9400d3",
@"deeppink": @"#ff1493",
@"deepskyblue": @"#00bfff",
@"dimgray": @"#696969",
@"dimgrey": @"#696969",
@"dodgerblue": @"#1e90ff",
@"firebrick": @"#b22222",
@"floralwhite": @"#fffaf0",
@"forestgreen": @"#228b22",
@"fuchsia": @"#ff00ff",
@"gainsboro": @"#dcdcdc",
@"ghostwhite": @"#f8f8ff",
@"gold": @"#ffd700",
@"goldenrod": @"#daa520",
@"gray": @"#808080",
@"grey": @"#808080",
@"green": @"#008000",
@"greenyellow": @"#adff2f",
@"honeydew": @"#f0fff0",
@"hotpink": @"#ff69b4",
@"indianred": @"#cd5c5c",
@"indigo": @"#4b0082",
@"ivory": @"#fffff0",
@"khaki": @"#f0e68c",
@"lavender": @"#e6e6fa",
@"lavenderblush": @"#fff0f5",
@"lawngreen": @"#7cfc00",
@"lemonchiffon": @"#fffacd",
@"lightblue": @"#add8e6",
@"lightcoral": @"#f08080",
@"lightcyan": @"#e0ffff",
@"lightgoldenrodyellow": @"#fafad2",
@"lightgray": @"#d3d3d3",
@"lightgrey": @"#d3d3d3",
@"lightgreen": @"#90ee90",
@"lightpink": @"#ffb6c1",
@"lightsalmon": @"#ffa07a",
@"lightseagreen": @"#20b2aa",
@"lightskyblue": @"#87cefa",
@"lightslategray": @"#778899",
@"lightslategrey": @"#778899",
@"lightsteelblue": @"#b0c4de",
@"lightyellow": @"#ffffe0",
@"lime": @"#00ff00",
@"limegreen": @"#32cd32",
@"linen": @"#faf0e6",
@"magenta": @"#ff00ff",
@"maroon": @"#800000",
@"mediumaquamarine": @"#66cdaa",
@"mediumblue": @"#0000cd",
@"mediumorchid": @"#ba55d3",
@"mediumpurple": @"#9370db",
@"mediumseagreen": @"#3cb371",
@"mediumslateblue": @"#7b68ee",
@"mediumspringgreen": @"#00fa9a",
@"mediumturquoise": @"#48d1cc",
@"mediumvioletred": @"#c71585",
@"midnightblue": @"#191970",
@"mintcream": @"#f5fffa",
@"mistyrose": @"#ffe4e1",
@"moccasin": @"#ffe4b5",
@"navajowhite": @"#ffdead",
@"navy": @"#000080",
@"oldlace": @"#fdf5e6",
@"olive": @"#808000",
@"olivedrab": @"#6b8e23",
@"orange": @"#ffa500",
@"orangered": @"#ff4500",
@"orchid": @"#da70d6",
@"palegoldenrod": @"#eee8aa",
@"palegreen": @"#98fb98",
@"paleturquoise": @"#afeeee",
@"palevioletred": @"#db7093",
@"papayawhip": @"#ffefd5",
@"peachpuff": @"#ffdab9",
@"peru": @"#cd853f",
@"pink": @"#ffc0cb",
@"plum": @"#dda0dd",
@"powderblue": @"#b0e0e6",
@"purple": @"#800080",
@"rebeccapurple": @"#663399",
@"red": @"#ff0000",
@"rosybrown": @"#bc8f8f",
@"royalblue": @"#4169e1",
@"saddlebrown": @"#8b4513",
@"salmon": @"#fa8072",
@"sandybrown": @"#f4a460",
@"seagreen": @"#2e8b57",
@"seashell": @"#fff5ee",
@"sienna": @"#a0522d",
@"silver": @"#c0c0c0",
@"skyblue": @"#87ceeb",
@"slateblue": @"#6a5acd",
@"slategray": @"#708090",
@"slategrey": @"#708090",
@"snow": @"#fffafa",
@"springgreen": @"#00ff7f",
@"steelblue": @"#4682b4",
@"tan": @"#d2b48c",
@"teal": @"#008080",
@"thistle": @"#d8bfd8",
@"tomato": @"#ff6347",
@"turquoise": @"#40e0d0",
@"violet": @"#ee82ee",
@"wheat": @"#f5deb3",
@"white": @"#ffffff",
@"whitesmoke": @"#f5f5f5",
@"yellow": @"#ffff00",
@"yellowgreen": @"#9acd32",
// https://www.w3.org/TR/css3-color/#transparent
@"transparent": @"rgba(0,0,0,0)",
};
});
NSString *rgba = knownColors[value];
if (!rgba) {
rgba = value;
}
if ([rgba hasPrefix:@"#"]) {
// #fff
if ([rgba length] == 4) {
unichar f = [rgba characterAtIndex:1];
unichar s = [rgba characterAtIndex:2];
unichar t = [rgba characterAtIndex:3];
rgba = [NSString stringWithFormat:@"#%C%C%C%C%C%C", f, f, s, s, t, t];
}
// 3. #rrggbb
uint32_t colorValue = 0;
sscanf(rgba.UTF8String, "#%x", &colorValue);
red = ((colorValue & 0xFF0000) >> 16) / 255.0;
green = ((colorValue & 0x00FF00) >> 8) / 255.0;
blue = (colorValue & 0x0000FF) / 255.0;
} else if ([rgba hasPrefix:@"rgb("]) {
// 4. rgb(r,g,b)
int r,g,b;
sscanf(rgba.UTF8String, "rgb(%d,%d,%d)", &r, &g, &b);
red = r / 255.0;
green = g / 255.0;
blue = b / 255.0;
} else if ([rgba hasPrefix:@"rgba("]) {
// 5. rgba(r,g,b,a)
int r,g,b;
sscanf(rgba.UTF8String, "rgba(%d,%d,%d,%lf)", &r, &g, &b, &alpha);
red = r / 255.0;
green = g / 255.0;
blue = b / 255.0;
}
} else if([value isKindOfClass:[NSNumber class]]) {
NSUInteger colorValue = [value unsignedIntegerValue];
red = ((colorValue & 0xFF0000) >> 16) / 255.0;
green = ((colorValue & 0x00FF00) >> 8) / 255.0;
blue = (colorValue & 0x0000FF) / 255.0;
}
color = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
// 6. cache color
if (color && value) {
[colorCache setObject:color forKey:value];
}
return color;
}
+ (CGColorRef)CGColor:(id)value
{
UIColor *color = [self UIColor:value];
return [color CGColor];
}
+ (NSString *)HexWithColor:(UIColor *)color
{
uint hex;
CGFloat red, green, blue, alpha;
if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
[color getWhite:&red alpha:&alpha];
green = red;
blue = red;
}
red = roundf(red * 255.f);
green = roundf(green * 255.f);
blue = roundf(blue * 255.f);
alpha = roundf(alpha * 255.f);
hex = ((uint)red << 16) | ((uint)green << 8) | ((uint)blue);
return [NSString stringWithFormat:@"#%02x", hex];
}
+ (WXBorderStyle)WXBorderStyle:(id)value
{
if([value isKindOfClass:[NSString class]]){
if ([value isEqualToString:@"solid"]) {
return WXBorderStyleSolid;
} else if ([value isEqualToString:@"dotted"]) {
return WXBorderStyleDotted;
} else if ([value isEqualToString:@"dashed"]) {
return WXBorderStyleDashed;
}
}
return WXBorderStyleSolid;
}
+ (WXClipType)WXClipType:(id)value
{
if([value isKindOfClass:[NSString class]]) {
NSString *string = (NSString *)value;
if ([string isEqualToString:@"visible"]) {
return NO;
} else if ([string isEqualToString:@"hidden"]) {
return YES;
}
}
return NO;
}
+ (WXPositionType)WXPositionType:(id)value
{
if([value isKindOfClass:[NSString class]]){
if ([value isEqualToString:@"relative"]) {
return WXPositionTypeRelative;
} else if ([value isEqualToString:@"absolute"]) {
return WXPositionTypeAbsolute;
} else if ([value isEqualToString:@"sticky"]) {
return WXPositionTypeSticky;
} else if ([value isEqualToString:@"fixed"]) {
return WXPositionTypeFixed;
}
}
return WXPositionTypeRelative;
}
#pragma mark Text
+ (NSTextAlignment)NSTextAlignment:(id)value
{
if([value isKindOfClass:[NSString class]]){
NSString *string = (NSString *)value;
if ([string isEqualToString:@"left"])
return NSTextAlignmentLeft;
else if ([string isEqualToString:@"center"])
return NSTextAlignmentCenter;
else if ([string isEqualToString:@"right"])
return NSTextAlignmentRight;
}
return NSTextAlignmentNatural;
}
+ (UIReturnKeyType)UIReturnKeyType:(id)value
{
if([value isKindOfClass:[NSString class]]){
NSString *string = (NSString *)value;
if ([string isEqualToString:@"defalut"])
return UIReturnKeyDefault;
else if ([string isEqualToString:@"go"])
return UIReturnKeyGo;
else if ([string isEqualToString:@"next"])
return UIReturnKeyNext;
else if ([string isEqualToString:@"search"])
return UIReturnKeySearch;
else if ([string isEqualToString:@"send"])
return UIReturnKeySend;
else if ([string isEqualToString:@"done"])
return UIReturnKeyDone;
}
return UIReturnKeyDefault;
}
+ (WXTextStyle)WXTextStyle:(id)value
{
if([value isKindOfClass:[NSString class]]){
NSString *string = (NSString *)value;
if ([string isEqualToString:@"normal"])
return WXTextStyleNormal;
else if ([string isEqualToString:@"italic"])
return WXTextStyleItalic;
}
return WXTextStyleNormal;
}
+ (CGFloat)WXTextWeight:(id)value
{
NSString *string = [WXConvert NSString:value];
if (!string)
return UIFontWeightRegular;
else if ([string isEqualToString:@"normal"])
return UIFontWeightRegular;
else if ([string isEqualToString:@"bold"])
return UIFontWeightBold;
else if ([string isEqualToString:@"100"])
return UIFontWeightUltraLight;
else if ([string isEqualToString:@"200"])
return UIFontWeightThin;
else if ([string isEqualToString:@"300"])
return UIFontWeightLight;
else if ([string isEqualToString:@"400"])
return UIFontWeightRegular;
else if ([string isEqualToString:@"500"])
return UIFontWeightMedium;
else if ([string isEqualToString:@"600"])
return UIFontWeightSemibold;
else if ([string isEqualToString:@"700"])
return UIFontWeightBold;
else if ([string isEqualToString:@"800"])
return UIFontWeightHeavy;
else if ([string isEqualToString:@"900"])
return UIFontWeightBlack;
return UIFontWeightRegular;
}
+ (WXTextDecoration)WXTextDecoration:(id)value
{
if([value isKindOfClass:[NSString class]]){
NSString *string = (NSString *)value;
if ([string isEqualToString:@"none"])
return WXTextDecorationNone;
else if ([string isEqualToString:@"underline"])
return WXTextDecorationUnderline;
else if ([string isEqualToString:@"line-through"])
return WXTextDecorationLineThrough;
}
return WXTextDecorationNone;
}
#pragma mark Image
+ (UIViewContentMode)UIViewContentMode:(id)value
{
if([value isKindOfClass:[NSString class]]){
NSString *string = (NSString *)value;
if ([string isEqualToString:@"cover"])
return UIViewContentModeScaleAspectFill;
else if ([string isEqualToString:@"contain"])
return UIViewContentModeScaleAspectFit;
else if ([string isEqualToString:@"stretch"])
return UIViewContentModeScaleToFill;
}
return UIViewContentModeScaleToFill;
}
+ (WXImageQuality)WXImageQuality:(id)value
{
if([value isKindOfClass:[NSString class]]){
NSString *string = (NSString *)value;
if ([string isEqualToString:@"original"])
return WXImageQualityOriginal;
else if ([string isEqualToString:@"normal"])
return WXImageQualityNormal;
else if ([string isEqualToString:@"low"])
return WXImageQualityLow;
else if ([string isEqualToString:@"high"])
return WXImageQualityHigh;
}
return WXImageQualityNone;
}
+ (WXImageSharp)WXImageSharp:(id)value
{
if([value isKindOfClass:[NSString class]]){
NSString *string = (NSString *)value;
if ([string isEqualToString:@"sharpen"])
return WXImageSharpening;
else if ([string isEqualToString:@"unsharpen"])
return WXImageSharpeningNone;
}
return WXImageSharpeningNone;
}
#pragma mark Scroller
+ (WXScrollDirection)WXScrollDirection:(id)value
{
if([value isKindOfClass:[NSString class]]){
NSString *string = (NSString *)value;
if ([string isEqualToString:@"none"])
return WXScrollDirectionNone;
else if ([string isEqualToString:@"vertical"])
return WXScrollDirectionVertical;
else if ([string isEqualToString:@"horizontal"])
return WXScrollDirectionHorizontal;
}
return WXScrollDirectionVertical;
}
+ (UITableViewRowAnimation)UITableViewRowAnimation:(id)value
{
if ([value isKindOfClass:[NSString class]]) {
NSString *string = (NSString *)value;
if ([string isEqualToString:@"none"]) {
return UITableViewRowAnimationNone;
} else if ([string isEqualToString:@"default"]) {
return UITableViewRowAnimationFade;
}
}
return UITableViewRowAnimationNone;
}
#pragma mark Animation
+ (UIViewAnimationOptions)UIViewAnimationTimingFunction:(id)value
{
if (![value isKindOfClass:[NSString class]]) {
return UIViewAnimationOptionCurveEaseInOut;
}
static NSDictionary *timingFunctionMapping;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
timingFunctionMapping = @{
@"ease-in":@(UIViewAnimationOptionCurveEaseIn),
@"ease-out":@(UIViewAnimationOptionCurveEaseOut),
@"ease-in-out":@(UIViewAnimationOptionCurveEaseInOut),
@"linear":@(UIViewAnimationOptionCurveLinear)
};
});
return [timingFunctionMapping[value] unsignedIntegerValue];
}
+ (CAMediaTimingFunction *)CAMediaTimingFunction:(id)value
{
if (![value isKindOfClass:[NSString class]]) {
return nil;
}
static NSDictionary *mapping;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
mapping = @{
@"ease-in":kCAMediaTimingFunctionEaseIn,
@"ease-out":kCAMediaTimingFunctionEaseOut,
@"ease-in-out":kCAMediaTimingFunctionEaseInEaseOut,
@"linear":kCAMediaTimingFunctionLinear,
@"ease":kCAMediaTimingFunctionDefault
};
});
NSString *timingFunction = mapping[value];
if ([timingFunction length] > 0) {
return [CAMediaTimingFunction functionWithName:timingFunction];
}
if ([value hasPrefix:@"cubic-bezier"]) {
float x1, y1, x2, y2;
sscanf(((NSString *)value).UTF8String, "cubic-bezier(%f,%f,%f,%f)", &x1, &y1, &x2, &y2);
return [CAMediaTimingFunction functionWithControlPoints:x1 :y1 :x2 :y2];
}
return [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
}
#pragma mark Visibility
+ (WXVisibility)WXVisibility:(id)value
{
if ([value isKindOfClass:[NSString class]]) {
NSString *string = (NSString *)value;
if ([string isEqualToString:@"visible"]) {
return WXVisibilityShow;
} else if ([string isEqualToString:@"hidden"]) {
return WXVisibilityHidden;
}
}
return WXVisibilityShow;
}
#pragma mark Gradient Color
+ (WXGradientType)gradientType:(id)value
{
WXGradientType type = WXGradientTypeToRight;
if ([value isKindOfClass:[NSString class]]) {
NSString *string = (NSString *)value;
if ([string isEqualToString:@"totop"]) {
type = WXGradientTypeToTop;
}
else if ([string isEqualToString:@"tobottom"]) {
type = WXGradientTypeToBottom;
}
else if ([string isEqualToString:@"toleft"]) {
type = WXGradientTypeToLeft;
}
if ([string isEqualToString:@"toright"]) {
type = WXGradientTypeToRight;
}
else if ([string isEqualToString:@"totopleft"]) {
type = WXGradientTypeToTopleft;
}
else if ([string isEqualToString:@"tobottomright"]) {
type = WXGradientTypeToBottomright;
}
}
return type;
}
#pragma mark - Length
+ (WXLength *)WXLength:(id)value isFloat:(BOOL)isFloat scaleFactor:(CGFloat)scaleFactor
{
if (!value) {
return nil;
}
WXLengthType type = WXLengthTypeFixed;
if ([value isKindOfClass:[NSString class]]) {
if ([value isEqualToString:@"auto"]) {
type = WXLengthTypeAuto;
} else if ([value isEqualToString:@"normal"]){
type = WXLengthTypeNormal;
} else if ([value hasSuffix:@"%"]) {
type = WXLengthTypePercent;
}
} else if (![value isKindOfClass:[NSNumber class]]) {
WXAssert(NO, @"Unsupported type:%@ for WXLength", NSStringFromClass([value class]));
}
if (isFloat) {
return [WXLength lengthWithFloat:([value floatValue] * scaleFactor) type:type];
} else {
return [WXLength lengthWithInt:([value intValue] * scaleFactor) type:type];
}
}
+ (WXBoxShadow *)WXBoxShadow:(id)value scaleFactor:(CGFloat)scaleFactor
{
NSString *boxShadow = @"";
if([value isKindOfClass:[NSString class]]){
boxShadow = value;
} else if([value isKindOfClass:[NSNumber class]]){
boxShadow = [((NSNumber *)value) stringValue];
} else if (value != nil) {
boxShadow = nil;
WXLogError(@"Convert Error:%@ can not be converted to boxshadow type", value);
}
if (boxShadow) {
return [WXBoxShadow getBoxShadowFromString:boxShadow scaleFactor:scaleFactor];
}
return nil;
}
+ (UIAccessibilityTraits)WXUIAccessibilityTraits:(id)value
{
UIAccessibilityTraits accessibilityTrait = UIAccessibilityTraitNone;
if (![value isKindOfClass:[NSString class]]) {
return accessibilityTrait;
}
NSString * role = value;
if ([role isEqualToString:@"button"]) {
accessibilityTrait = UIAccessibilityTraitButton;
} else if ([role isEqualToString:@"link"]) {
accessibilityTrait = UIAccessibilityTraitLink;
} else if ([role isEqualToString:@"img"]) {
accessibilityTrait = UIAccessibilityTraitImage;
} else if ([role isEqualToString:@"search"]) {
accessibilityTrait = UIAccessibilityTraitSearchField;
} else if ([role isEqualToString:@"tab"]) {
#ifdef __IPHONE_10_0
if (WX_SYS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"10.0")) {
accessibilityTrait = UIAccessibilityTraitTabBar;
}
#endif
} else if ([role isEqualToString:@"frequentUpdates"]) {
accessibilityTrait = UIAccessibilityTraitUpdatesFrequently;
} else if ([role isEqualToString:@"startsMedia"]) {
accessibilityTrait = UIAccessibilityTraitStartsMediaSession;
} else if ([role isEqualToString:@"allowsDirectInteraction"]) {
accessibilityTrait = UIAccessibilityTraitAllowsDirectInteraction;
} else if ([role isEqualToString:@"summary"]) {
accessibilityTrait = UIAccessibilityTraitSummaryElement;
} else if ([role isEqualToString:@"header"]) {
accessibilityTrait = UIAccessibilityTraitHeader;
} else if ([role isEqualToString:@"keyboardKey"]) {
accessibilityTrait = UIAccessibilityTraitKeyboardKey;
} else if ([role isEqualToString:@"disabled"]) {
accessibilityTrait = UIAccessibilityTraitNotEnabled;
} else if ([role isEqualToString:@"playSound"]) {
accessibilityTrait = UIAccessibilityTraitPlaysSound;
} else if ([role isEqualToString:@"selected"]) {
accessibilityTrait = UIAccessibilityTraitSelected;
} else if ([role isEqualToString:@"pageTurn"]) {
accessibilityTrait = UIAccessibilityTraitCausesPageTurn;
} else if ([role isEqualToString:@"text"]) {
accessibilityTrait = UIAccessibilityTraitStaticText;
}
return accessibilityTrait;
}
@end
@implementation WXConvert (Deprecated)
+ (WXPixelType)WXPixelType:(id)value
{
CGFloat pixel = [self WXPixelType:value scaleFactor:1.0];
return pixel * WXScreenResizeRadio();
}
@end