IOS中Weex 加载 .xcassets 中的图片资源的实例详解
IOS中Weex加载.xcassets中的图片资源的实例详解
前言:
因为.xcassets中的图片资源只能通过imageNamed:方法加载,所以需要做一些特殊处理,才能提供给Weex使用(PS:纯属娱乐,因为Weex跨平台的特性,这种针对某一端做实现的方案实用价值并不大)。
方案
观察WeexSDK发现有WXImgLoaderProtocol这个协议,这个协议包含了下面的方法:
-(id)downloadImageWithURL:(NSString*)urlimageFrame: (CGRect)imageFrameuserInfo:(NSDictionary*)optionscompleted:(void(^)(UIImage*image, NSError*error,BOOLfinished))completedBlock;
从名字就可以看出来,这个方法声明的功能就是通过指定的URL下载图片并返回一个UIImage对象。
下载过WeexDemo的人应该都知道里面有一个叫WXImgLoaderDefaultImpl的类(PS:别告诉我你对Weex感兴趣确连WeexDemo里面有啥都不知道)。这个类实现了WXImgLoaderProtocol协议,内容如下:
-(id)downloadImageWithURL:(NSString*)urlimageFrame:(CGRect)imageFrameuserInfo:(NSDictionary*)userInfocompleted:(void(^)(UIImage*image,NSError*error,BOOLfinished))completedBlock { if([urlhasPrefix:@"//"]){ url=[@"http:"stringByAppendingString:url]; } return(id )[[SDWebImageManagersharedManager]downloadImageWithURL:[NSURLURLWithString:url]options:0progress:^(NSIntegerreceivedSize,NSIntegerexpectedSize){ }completed:^(UIImage*image,NSError*error,SDImageCacheTypecacheType,BOOLfinished,NSURL*imageURL){ if(completedBlock){ completedBlock(image,error,finished); } }]; }
其实就是利用SDWebImage这个库实现图片下载功能。而且我还发现,如果不实现WXImgLoaderProtocol协议,就无法在Weex的代码中通过URL加载网络图片。也就是说Weex其实是依赖原生来做网络图片加载,至于为什么这么做,我只能说:我不知道。
然后WeexDemo通过下面的代码把WXImgLoaderDefaultImpl注册为Weex的一个iOS原生handler
[WXSDKEngineregisterHandler:[WXImgLoaderDefaultImplnew]withProtocol:@protocol(WXImgLoaderProtocol)];
这样我们就可以在Weex中加载网络图片了,比如:
好了,现在就来说说怎么加载.xcassets中的图片资源,其实很简单,在WXImgLoaderDefaultImpl实现的方法中添加几行代码就可以:
if([urlhasPrefix:@"xcassets:"]){ UIImage*image=[UIImageimageNamed:[urlsubstringFromIndex:9]]; completedBlock(image,nil,YES); return[WXXCassetsLoaderOperationnew]; }
这里我定义的规则是:xcassets:+[.xcassets中的图片名]。所以我们判断url是不是以xcassets:开头,如果是,通过imageNamed方法加载图片并返回即可。
因为downloadImageWithURL方法要求返回遵循WXImageOperationProtocol协议的对象,所以我们新建一个WXXCassetsLoaderOperation类,然后实现WXImageOperationProtocol协议中的cancel方法:
-(void)cancel{ }
然后我们就可以在Weex中加载.xcassets中的图片了。代码如下:
以上就是IOS中Weex加载.xcassets中的图片资源的实例详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。