文档章节

iOS中理解坐标系

Megan_zhou
 Megan_zhou
发布于 2014/04/30 14:25
字数 1038
阅读 2743
收藏 1
点赞 0
评论 0

坐标、点和像素之间的微妙转换也可能降低绘制性能,导致线条和文字模糊。观察以下代码:

CGContextSetLineWidth(context, 3.); // 绘制从坐标{10, 100}到{200, 100}的3像素宽水平线条 
CGContextMoveToPoint(context, 10., 100.);
GContextAddLineToPoint(context, 200., 100.);
CGContextStrokePath(context); // 绘制从坐标{10, 105.5} 到 {200, 105.5}的3像素宽水平线条 
CGContextMoveToPoint(context, 10., 105.5);
CGContextAddLineToPoint(context, 200., 105.5); GContextStrokePath(context);



图8-3展示了这个程序在非Retina屏幕上的输出结果,这里放大了图片,可以更清晰地看出区别。

enter image description here

图8-3 比较分别从{10, 100}和{10, 105.5}出发的两条线

从{10, 100}到{200, 100}的线条要比从{10, 105.5}到{200, 105.5}的线条模糊很多,原因就在于iOS对坐标系的解读方式。

构造一个CGPath时,便是使用了所谓的**几何坐标系**。这与数学中使用的坐标系是一样的,以两条网格线的交点来表示零坐标点。你无法绘制出真正的几何点或几何线条,因为它们都是无限小和无限细的。iOS绘制中必须将这些几何对象转换成**像素坐标**。这是一个可以指定颜色的2D网格。像素是设备能控制的最小显示区域单位。来看图8-4。

enter image description here

图8-4 展示从{10, 100}到{200, 100}的几何线条

当调用了CGContextStrokePath,iOS会让线条沿路径居中。理想情况下,线条有3像素宽,从y = 98.5到y = 101.5,如图8-5所示。

enter image description here

图8-5 理想的3像素宽线条

但是,这个线条仍不能绘制。每个像素必须有唯一的颜色,线条顶部和底部的像素有两种颜色。一半是画笔颜色,一半是背景颜色。iOS通过取两个颜色的平均值解决了这个问题。同样的技术也用在了反锯齿上,如图8-6所示。

enter image description here

图8-6 反锯齿的3像素宽线条

在屏幕上,线条看起来会有些模糊。解决这个问题的方法就是将水平或垂直的线条移动到半个点的位置,这样当iOS将线条居中时,边缘刚好就是像素的边界。或者可以让线条更粗一些。

使用非整型宽度的线条,或者坐标系不是整型和半整型时,也可能遇到这个问题。让iOS绘制小数像素时都有可能导致模糊。

填充工具与画笔不一样。画笔的线条是中心对齐路径的,而填充颜色是基于路径的。如果填充从{10, 100}到{200, 103}的矩形,每个像素都会被正确填充,如图8-7所示。

enter image description here

图8-7 填充从{10, 100}到{200, 103}的矩形

目前的讨论视点与像素相同。而在Retina屏幕上,它们就不一样了。iPhone 4的每个点有4个像素,缩放比例为2。这样事情就有了一些微妙的变化,而且通常是情况更好了。因为Core Graphics与UIKit的坐标都是用点表示的,所有整数宽度的线条都以偶数个像素来表示了。比如说,如果需要1个点宽的画笔,实际上就是一个2像素宽的画笔。绘制这条线,iOS需要填充路径两边的像素。这样就会是整数的像素,因此不需要反锯齿处理。当然,如果使用的坐标系不是整数或半整数的,依然有可能遇到模糊的情况。

在Retina屏幕上并不需要位移半个点的位置,不过这不会有影响。若是要支持iPhone 3GS或iPad2,便需要对水平或垂直线条使用半个点的位移。

只能对水平或垂直线条使用这些方法。斜线与曲线应该进行反锯齿处理以便不会出现缺口,没有必要为它们进行偏移操作。

本文转载自:http://wiki.eoe.cn/page/iOS_pptl_artile_28212.html

共有 人打赏支持
Megan_zhou
粉丝 72
博文 113
码字总数 30181
作品 0
浦东
程序员
iOS高仿QQ侧滑控件、下载框架、动画效果、扫一扫、颜色变化、K线图等源码

iOS精选源码 仿京东"加入购物车"转场动画(http://www.code4app.com/thread-28162-1-1.html) ColorTool(颜色转换)(http://www.code4app.com/thread-29256-1-1.html) Swift 专业版K线(http://w......

sunnyaigd ⋅ 04/17 ⋅ 0

面试官自述:面向高级开发人员的iOS面试问题

当您准备进行技术性iOS面试时,了解您可能会询问哪些主题以及经验丰富的iOS开发人员期望什么是非常重要的。 这是许多硅谷公司用来衡量iOS候选人资历水平的一系列问题。 这些问题涉及iOS开发的...

菇哒微课 ⋅ 04/26 ⋅ 0

Unity与IOS交互,调用IOS系统相机和相册

前面两篇总结了一下unity与android的简单交互和调用安卓系统相机和相册,比较蛋疼的是,后来发现不同的测试机上会有不同的bug。。。下阶段要一个一个的解决一下 今天总结一下与IOS的交互。这...

qq_32587659 ⋅ 05/16 ⋅ 0

【AR】开始使用Vuforia开发iOS(2)

原 设置iOS开发环境 安装Vuforia iOS SDK 如何安装Vuforia iOS示例 编译并运行Vuforia iOS示例 支持iOS金属 iOS 64位迁移 设置iOS开发环境 适用于iOS的Vuforia引擎目前支持运行iOS 9及更高版...

lichong951 ⋅ 06/11 ⋅ 0

如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊 ⋅ 05/26 ⋅ 0

iOS天气动画、高仿QQ菜单、放京东APP、高仿微信、推送消息等源码

iOS精选源码 TYCyclePagerView iOS上的一个无限循环轮播图组件(http://www.code4app.com/thread-14507-1-1.html) iOS高仿微信完整项目源码(http://www.code4app.com/thread-14695-1-1.html)......

sunnyaigd ⋅ 06/12 ⋅ 0

iOS自定义弹出视图、收音机APP、图片涂鸦、加载刷新、文件缓存等源码

iOS精选源码 一款优秀的 聆听夜空FM 源码(http://www.code4app.com/thread-14546-1-1.html) zhPopupController 简单快捷弹出自定义视图(http://www.code4app.com/thread-14861-1-1.html) WHS......

sunnyaigd ⋅ 06/04 ⋅ 0

iOS逆向工程- 学习整理(工具详解)

前言 一、逆向工程的要求 具备丰富的 iOS 开发经验 最好能非常熟悉 iOS 设备的硬件构成,iOS 系统的运行原理。 拿到任意一个 App 之后能够大致推断出它的项目规模和使用的技术,比如它的MVC模...

_小迷糊 ⋅ 05/11 ⋅ 0

iOS小白点效果、打地鼠游戏、轮播效果、画板、富文本编辑器等源码

iOS精选源码 美团外卖商家点菜页面(http://www.code4app.com/thread-29383-1-1.html) 板书录制演示程序(http://www.code4app.com/thread-29384-1-1.html) 分类轮播、直播间礼物列表轮播 -- O...

sunnyaigd ⋅ 04/24 ⋅ 0

iOS ZipperDown 漏洞来袭,我们该如何应对?

  昨天傍晚盘古实验室负责任的披露了针对 iOS 应用的 ZipperDown 漏洞,并提供了检索、查询受影响应用的平台: zipperdown.com。基于目前公开的信息,该漏洞的影响面比较大,15000 多个应用...

FreeBuf ⋅ 05/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java集合类总结笔记

一、集合类的层次关系 主要容器集合类的特点: ArrayList 一种可以动态增长和缩减的索引序列 LinkedList 一种可以在任何位置进行高效地插入和删除的有序序列 ArrayDeque 一种用循环数组实现的...

edwardGe ⋅ 6分钟前 ⋅ 0

spring RMI远程调用

RMI https://www.cnblogs.com/wdh1995/p/6792407.html

BobwithB ⋅ 11分钟前 ⋅ 0

Jenkins实践2 之基本配置

1 插件管理 系统管理->插件管理 在可选插件中可以自主安装插件 2 管理用户 系统管理->管理用户->新建用户 3 安全配置 系统管理->全局安全配置 授权策略 选择安全矩阵 然后添加现有的用户,赋...

晨猫 ⋅ 11分钟前 ⋅ 0

c++智能指针

1、是一种泛型类,针对指针类型的泛型类,会保存指针 2、重载了符号 *和-> 对智能指针使用这两个符号,相当于对保存的泛型使用这两个符号 3、当智能指针引用计数为0时,会去释放指针指向的资...

国仔饼 ⋅ 12分钟前 ⋅ 0

Spring Boot错误处理机制

1)、SpringBoot默认的错误处理机制 默认效果: 1)、浏览器,返回一个默认的错误页面 浏览器发送请求的请求头: 2)、如果是其他客户端,默认响应一个json数据 原理: 可以参照ErrorMvcAut...

小致dad ⋅ 14分钟前 ⋅ 0

ftp连接不上的终极办法 SFTP

假如FTP由于各种原因就是连不上,那么用SFTP协议吧,使用登录服务器的账号密码。

sskill ⋅ 18分钟前 ⋅ 0

Unity 围绕旋转角度限制(Transform.RotateAround)

在 Unity 中可以利用 Transform.RotateAround 围绕指定物体进行旋转,但某些情况下可能需要对旋转角度进行控制。我是先计算出预设角度大小,然后判断是否在限定角度范围内是则进行旋转。 相关...

大轩 ⋅ 19分钟前 ⋅ 0

阿里沙箱环境支付宝测试demo

阿里支付宝支付和微信支付,包括:阿里沙箱环境支付宝测试demo,支付宝支付整合到spring+springmvc+mybatis环境和微信整合到如上环境,功能非常齐全,只需要修改对应的配置文件即可,帮助文档...

码代码的小司机 ⋅ 22分钟前 ⋅ 0

JDK1.6和JDK1.7中,Collections.sort的区别,

背景 最近,项目正在集成测试阶段,项目在服务器上运行了一段时间,点击表格的列进行排序的时候,有的列排序正常,有的列在排序的时候,在后台会抛出如下异常,查询到不到数据,而且在另外一...

tsmyk0715 ⋅ 39分钟前 ⋅ 0

C++ 中命名空间的 5 个常见用法

相信小伙伴们对C++已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述。 命名空间在1995年被引入到 c++ 标准中,通常是这样定义的: 命名...

柳猫 ⋅ 43分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部