热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SVG在iOS中使用总结

SVG简介SVG是一种用XML定义的语言,用来描述二维矢量及矢量栅格图形。SVG提供了3种类型的图形对象:矢量图形(vectorgrap

SVG简介

SVG是一种用XML定义的语言,用来描述二维矢量及矢量/栅格图形。SVG提供了3种类型的图形对象:矢量图形(vectorgraphicshape例如:由直线和曲线组成的路径)、图象(image)、文本(text)。图形对象还可进行分组、添加样式、变换、组合等操作,特征集包括嵌套变换(nestedtransformations)、剪切路径(clippingpaths)、alpha蒙板(alphamasks)、滤镜效果(filtereffects)、模板对象(templateobjects)和其它扩展(extensibility)。SVG图形是可交互的和动态的,可以在SVG文件中嵌入动画元素或通过脚本来定义动画。


SVG优势


  1. SVG 可被非常多的工具读取和修改(比如记事本)
  2. SVG 与 JPEG 和 GIF 图像比起来,尺寸更小,且可压缩性更强。
  3. SVG 是可伸缩的
  4. SVG 图像可在任何的分辨率下被高质量地打印
  5. SVG 可在图像质量不下降的情况下被放大
  6. SVG 图像中的文本是可选的,同时也是可搜索的(很适合制作地图)
  7. SVG 可以与 Javascript 技术一起运行
  8. SVG 是开放的标准
  9. SVG 文件是纯粹的 XML 

SVG在iOS中的运用

SVG在iOS中可以用UIWebView来加载:

NSString *svgName = @"fruit_map.svg";NSString *svgPath = [[NSBundle mainBundle] pathForResource:svgName ofType:nil];NSData *svgData = [NSData dataWithContentsOfFile:svgPath];NSString *reasourcePath = [[NSBundle mainBundle] resourcePath];NSURL *baseUrl = [[NSURL alloc] initFileURLWithPath:reasourcePath isDirectory:true];UIWebView *webView = [[UIWebView alloc] init];webView.frame = CGRectMake(0, CGRectGetMaxY(htpBtn.frame)+50, self.view.bounds.size.width, 300);[webView loadData:svgData MIMEType:@"image/svg+xml" textEncodingName:@"UTF-8" baseURL:baseUrl];[self.view addSubview:webView];

这种方法来加载SVG,虽然也可以,但是却存在诸如放大缩小、点击交互等问题。所以一般更加推荐使用SVGKit。

SVGKit使用

1、SVG创建

SVGKImage *svgImage = [SVGKImage imageNamed:svgName];SVGKFastImageView *svgView = [[SVGKFastImageView alloc] initWithSVGKImage:svgImage];svgView.frame = CGRectMake(0, CGRectGetMaxY(htpBtn.frame)+50, self.view.bounds.size.width, 300);[self.view addSubview:svgView];

2、实现SVG放大缩小功能

- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor whiteColor];UIScrollView *scrollViewForSVG = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 200, self.view.bounds.size.width, self.view.bounds.size.height-200)];scrollViewForSVG.delegate = self;[self.view addSubview:scrollViewForSVG];_scrollViewForSVG = scrollViewForSVG;SVGKFastImageView *cOntentView= [[SVGKFastImageView alloc] initWithFrame:scrollViewForSVG.frame];[scrollViewForSVG addSubview:contentView];self.cOntentView= contentView;SampleFileInfo *info = [SampleFileInfo sampleFileInfoWithFilename:@"12.svg"];[self loadSVGFrom:info.source];
}-(void)loadSVGFrom:(SVGKSource *) svgSource{[SVGKImage imageWithSource:svgSourceonCompletion:^(SVGKImage *loadedImage, SVGKParseResult* parseResult){dispatch_async(dispatch_get_main_queue(), ^{loadedImage.DOMDocument.title = @"123";[self internalLoadedResource:svgSource parserOutput:parseResult createImageViewFromDocument:loadedImage];});}];
}-(void) internalLoadedResource:(SVGKSource*) source parserOutput:(SVGKParseResult*) parseResult createImageViewFromDocument:(SVGKImage*) document
{SVGKImageView* newCOntentView= nil;newCOntentView= [[SVGKFastImageView alloc] initWithSVGKImage:document];((SVGKFastImageView*)newContentView).disableAutoRedrawAtHighestResolution = TRUE;[self didLoadNewResourceCreatingImageView:newContentView];
}-(void)didLoadNewResourceCreatingImageView:(SVGKImageView*) newContentView{if (newContentView != nil) {self.cOntentView= newContentView;self.contentView.showBorder = YES;[self.scrollViewForSVG addSubview:self.contentView];[self.scrollViewForSVG setContentSize: self.contentView.frame.size];float screenToDocumentSizeRatio = self.scrollViewForSVG.frame.size.width / self.contentView.frame.size.width;self.scrollViewForSVG.minimumZoomScale = MIN( 2.5, screenToDocumentSizeRatio );self.scrollViewForSVG.maximumZoomScale = MAX( 2.5, screenToDocumentSizeRatio );[self.scrollViewForSVG setZoomScale:1.00 animated:YES];}
}

实现UIScrollView的代理方法:

//代理方法,告诉ScrollView要缩放的是哪个视图
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{return self.contentView;
}
-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)finalScale
{view.transform = CGAffineTransformIdentity; view.bounds = CGRectApplyAffineTransform(view.bounds, CGAffineTransformMakeScale(finalScale, finalScale));[view setNeedsDisplay];self.scrollViewForSVG.minimumZoomScale /= finalScale;self.scrollViewForSVG.maximumZoomScale /= finalScale;
}

3、SVG上进行路线规划

SVG上的线路规划,需要从服务器中拿取相关的坐标点,然后将其绘制在SVG上。具体实现如下:

-(void) didLoadNewResourceCreatingImageView:(SVGKImageView*) newContentView
{if( newContentView != nil ){self.cOntentView= newContentView;self.contentView.showBorder = YES;/** Move the gesture recognizer onto the new one */if( self.tapGestureRecognizer == nil ){self.tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)];}[self.contentView addGestureRecognizer:self.tapGestureRecognizer];[self.contentView addSubview:self.imageView];[self.scrollViewForSVG addSubview:self.contentView];[self.scrollViewForSVG setContentSize: self.contentView.frame.size];float screenToDocumentSizeRatio = self.scrollViewForSVG.frame.size.width / self.contentView.frame.size.width;self.scrollViewForSVG.minimumZoomScale = MIN( 2.5, screenToDocumentSizeRatio );self.scrollViewForSVG.maximumZoomScale = MAX( 2.5, screenToDocumentSizeRatio );[self.scrollViewForSVG setZoomScale:1.00 animated:YES];}UIBezierPath * path = [[UIBezierPath alloc]init];path.lineWidth = 1.0;[path moveToPoint:CGPointMake( 0, 527 )];[path addLineToPoint:CGPointMake( 90, 527 )];[path addLineToPoint:CGPointMake( 99.96, 541.85 )];[path addLineToPoint:CGPointMake( 153.13, 546.03 )];[path addLineToPoint:CGPointMake( 204.96, 560.85 )];[path addLineToPoint:CGPointMake( 250.96, 585.85 )];[path addLineToPoint:CGPointMake( 310.87, 636.47 )];[path addLineToPoint:CGPointMake( 336.96, 662.85 )];[path addLineToPoint:CGPointMake( 402.5, 641.5 )];[path addLineToPoint:CGPointMake( 485.5, 647.5 )];CAShapeLayer *lineChartLayer = [CAShapeLayer layer];lineChartLayer.path = path.CGPath;lineChartLayer.strokeColor = [UIColor redColor].CGColor;lineChartLayer.fillColor = [[UIColor clearColor] CGColor];// 默认设置路径宽度为0,使其在起始状态下不显示lineChartLayer.lineWidth = 1;[self.contentView.layer addSublayer:lineChartLayer];
}

效果如下:

 

 


推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
author-avatar
Missluckyyy_879
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有