近日,发现安卓同学在项目中使用的都是SVG(矢量图)的图片。
那么,什么是svg呢?svg在放大或者缩小的情况下,图像的图形质量不会有所损失,而且要比png,jpeg小很多。
但是有个问题是安卓那边是可以直接使用svg图片的,iOS这边则需要先导入svg库,才能使用。
pod "SVGKit"
终端报错,提示Could not resolve proxy: “”
报错原因是协议
终端输入:vim ~/.gitconfig,打开配置文件,删除所有协议
重新pod install,导入成功,但编译项目,报错Module 'CocoaLumberjack' not found
因为SVGkit需要依赖CocoaLumberjack第三方,但在cocopods导入时,已经默认一起导入。
寻求其他解决方法:
pod 'SVGKit', :git => 'https://github.com/SVGKit/SVGKit.git', :branch => '2.x'
pod 'CocoaLumberjack'
以这种形式导入编译就不报错了。
引入头文件
#import "SVGKit.h"
#import "SVGKImage.h"
#import "SVGKParser.h"
#import "UIImage+SVG.h"(这个是自己封装的svg分类)
接下来就是展示svg分类文件代码的时刻
.h文件
/** show svg image
@param name svg name
@return svg image
*/
+ (UIImage*)br_svgImageNamed:(NSString*)name;
/**
show svg image
@param name svg name
@param size image size
@return svg image
*/
+ (UIImage*)br_svgImageNamed:(NSString*)namesize:(CGSize)size;
/**
show svg image
@param name svg name
@param size image size
@param tintColor image color
@return svg image
*/
+ (UIImage*)br_svgImageNamed:(NSString*)namesize:(CGSize)sizetintColor:(UIColor*)tintColor;
.m文件
/**
show svg image
@param name svg name
@return svg image
*/
+ (UIImage*)br_svgImageNamed:(NSString*)name {
SVGKImage*svgImage = [SVGKImageimageNamed:name];
returnsvgImage.UIImage;
}
/**
show svg image
@param name svg name
@param size image size
@return svg image
*/
+ (UIImage*)br_svgImageNamed:(NSString*)namesize:(CGSize)size {
SVGKImage*svgImage = [SVGKImageimageNamed:name];
svgImage.size= size;
returnsvgImage.UIImage;
}
/**
show svg image
@param name svg name
@param size image size
@param tintColor image color
@return svg image
*/
+ (UIImage*)br_svgImageNamed:(NSString*)namesize:(CGSize)sizetintColor:(UIColor*)tintColor {
SVGKImage*svgImage = [SVGKImageimageNamed:name];
svgImage.size= size;
CGRectrect =CGRectMake(0,0, svgImage.size.width, svgImage.size.height);
CGImageAlphaInfoalphaInfo =CGImageGetAlphaInfo(svgImage.UIImage.CGImage);
BOOL opaque = alphaInfo == kCGImageAlphaNoneSkipLast || alphaInfo == kCGImageAlphaNoneSkipFirst || alphaInfo == kCGImageAlphaNone;
UIGraphicsBeginImageContextWithOptions(svgImage.size, opaque, svgImage.scale);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context,0, svgImage.size.height);
CGContextScaleCTM(context,1.0, -1.0);
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextClipToMask(context, rect, svgImage.UIImage.CGImage);
CGContextSetFillColorWithColor(context, tintColor.CGColor);
CGContextFillRect(context, rect);
UIImage *imageOut = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
returnimageOut;
}
调用
UIImage*image = [UIImage br_svgImageNamed:@"图片"];
UIImage*image2=[UIImage br_svgImageNamed:@"icon_back.svg"size:CGSizeMake(12.0,24.0)];
UIImage*image3=[UIImage br_svgImageNamed:@"icon_back.svg"size:CGSizeMake(12.0,24.0)tintColor:[UIColor whiteColor]];
(不需要.svg后缀)
或者
// SVGKImage *svgImage = [SVGKImage imageNamed:@"playedBtnImg-1.svg"];
// self.playedBtnImg = [[SVGKLayeredImageView alloc] initWithSVGKImage:svgImage];
// [self.playedView addSubview:self.playedBtnImg];
有个问题需要注意的是,如果用iOS原生uiimage赋值图片,如果图片被删,那么顶多是这个图片展示不出来,但如果换用svg格式,找不到图片会crash