iOS中线宽与像素的关系

一. 什么是scale factor

[UIScreen mainScreen]中有个属性叫做scale,这个属性全称为scale factor,即比例因子.这个属性代表了从逻辑坐标系转化成当前的设备坐标系的转化比例. UIKit框架中的view都有一个contentScaleFactor的属性,表达的意义一样.

逻辑坐标系即我们数学上经常用的坐标体系,是对现实事物的一种抽象.比如说我们要在app上显示一个正方形,我们会确定它的坐标(100,100)和宽高(100,100).在这里,坐标和宽高的数值都是对这个正方形的一种抽象.在实际显示的过程中,坐标的具体位置和宽高的实际长度则由具体硬件的物理属性和它规定的坐标体系进行表达.在逻辑坐标系中,以points作为测量单位,即通常在数学的坐标系中用来表示最小的测量单位.

在我们进行编程时,frame,center中设置的表达坐标位置所使用的CGFloat参数就是以point为单位的.

设备坐标系是设备实际的坐标系.在实际屏幕中,是以像素(Pixel)作为基本的测量单位.

由于两个坐标系的单位不统一,这时需要进行坐标系的转换.

iOS中当我们使用Quartz,UIKit,CoreAnimation等框架时,所有的坐标系统采用Point来衡量.系统在实际渲染到设置时会帮助我们处理Point到Pixel的转换.

二. 坐标系的转换

scale属性反映了从逻辑坐标到设备屏幕坐标的转换.在非视网膜屏幕上,比例因子值为1.0,即逻辑坐标系中的一个点等于设备中一个像素(1×1),在视网膜屏幕中,比例因子值为2.0,即逻辑坐标系中的一个点等于设备中四个像素(2×2).同理,在6plus这种scale为3.0的设备上,1point等于9pixels.

因此,当我们在绘图中做出一条线宽为1的线时,在非视网膜屏幕和视网膜屏幕上的情况是不同的.

非视网膜屏幕和视网膜屏幕上一个线宽时的显示情况

在非视网膜屏幕中,当我们把线宽为1的线画在(3,0)上时,线为一个像素点的宽度(虚线部分),由于事实上不能让一个像素点显示半个像素,所以iOS的反锯齿技术让1个线宽的线显示出了2个像素宽度的一条线(浅色部分),并且颜色变浅.只有对线进行0.5的偏移才能显示真正的线宽为1的线.

偏移了0.5(point)才能显示一个像素宽度的线

在视网膜屏幕中,如果想要画出宽度为一个像素的线,不仅需要先0.5point的线宽,还要进行0.25point的偏移,才能绘出一个像素点宽度的线.

当然,如果没有特殊的需求,苹果不建议使用宽度为一个像素点的线,因为在视网膜屏幕上太细会看不清楚.

时间: 2024-10-28 14:59:02

iOS中线宽与像素的关系的相关文章

转iOS中delegate、protocol的关系

iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolcategoryobject-c 刚开始接触iOS,对delegate.protocol这两个概念比较模糊.参考了一些资料,记录下来体会. 1.protocol protocol和interface的概念类似,是object-c语法的一部分.protocol就是一系列不属于任何类的方法的列表.其中声明

iOS 中 UIView 和 CALayer 的关系

UIView 有一个名叫 layer ,类型为 CALayer 的对象属性,它们的行为很相似,主要区别在于:CALayer 继承自 NSObject ,不能够响应事件. 这是因为 UIView 除了负责响应事件 ( 继承自 UIReponder ) 外,它还是一个对 CALayer 的底层封装.可以说,它们的相似行为都依赖于 CALayer 的实现,UIView 只不过是封装了它的高级接口而已. 那 CALayer 是什么呢? CALayer(图层) 文档对它定义是:管理基于图像内容的对象,允许

IOS中使用像素位图(CGImageRef)对图片进行处理

IOS中对图片进行重绘处理的方法总结 一.CGImageRef是什么 CGImageRef是定义在QuartzCore框架中的一个结构体指针,用C语言编写.在CGImage.h文件中,我们可以看到下面的定义: ? 1 typedef struct CGImage *CGImageRef; CGImageRef 和 struct CGImage * 是完全等价的.这个结构用来创建像素位图,可以通过操作存储的像素位来编辑图片. QuartzCore这个框架是可移植的. 二.CGImageRef相关的

iOS 中使用.9图

背景 .9图来源于Android.为了设计出一套图,兼容Android和iOS,使用.9图的方式来对图片进行拉伸以适应不同的屏幕.在iOS中没有.9图的概念,只能先了解Android的.9图再进行模拟Android的方法. 什么是.9图片 即图片后缀名前有.9的图片,如pic.9.png.pic1.9.jgp,诸如此类的图片就称为.9图片.且在原始图片四周添加了一个像素,在这一个像素上用黑线标识出相关的区域. .9图片的作用 .9图片的作用是在图片拉伸的时候特定的区域不会发生图片失真,特定的区域

iOS 的视图层次结构、继承关系及常用结构体探讨

UIView表示屏幕上的一块矩形区域,它在App中占有绝对重要的地位,因为IOS中几乎所有可视化控件都是UIView的子类.负责渲染区域的内容,并且响应该区域内发生的触摸事件 UIView的功能 1.管理矩形区域里的内容2.处理矩形区域中的事件3.子视图的管理 4.还能实现动画  UIView的子类也具有这些功能 下图就是视图的内层次 1)三个结构体 CGPoint.CGSize.CGRect 1.  CGPoint struct CGPoint { CGFloat x; CGFloat y;

IOS中的多线程【二】— NSOperation和NSOperationQueue

NSOperationQueue是一套基于Objective-c语言的API. GCD与NSOperationQueue的优缺点: NSOperationQueue:比较安全 GCD:没有NSOperationQueue安全,但使用起来简单,快速,还提供了一些操控底层的方法.实际开发中还是以GCD为主. NSOperationQueue实现多线程流程 1.定义一个任务队列. 2.定义一个任务. 3.把任务添加到队列中.一旦任务被添加到队列中,任务会马上被调度执行. 任务队列(NSOperatio

iOS开发笔记--iOS中的多线程

摘要 本文主要介绍iOS开发中的三种多线程技术:NSThread, NSOperation/NSOperationQueue, GCD.以及在多线程编程中的注意点和小技巧. 多线程 NSThread NSOperation/NSOperationQueue GCD 目录[-] iOS中的多线程 iOS的三种多线程技术特点: GCD基本思想 队列: 操作: 不同队列中嵌套同步操作dispatch_sync的结果: 同步操作dispatch_sync的应用场景: GCD优点: GCD队列: NSOp

iOS中消息的传递机制(KVO、Notification、delegation、block以及target-action)---转载

注1:本文由破船[博客]译自Communication Patterns. 本文目录如下所示: 可用的机制 做出正确的选择 Framework示例 小结 每个应用程序或多或少,都由一些松耦合的对象构成,这些对象彼此之间要想很好的完成任务,就需要进行消息传递.本文将介绍所有可用的消息传递机制,并通过示例来介绍这些机制在苹果的Framework中如何使用,同时,还介绍了一些最佳实践建议,告诉你什么时机该选择使用什么机制. 虽然这一期的主题是关于Foundation Framework的,不过本文中还

iOS 中 XML 数据交换格式

     XML 是一种自描述的数据交换格式,但是 XML 的数据交换格式并没有 JSON 来的轻便,但是无可否认的是,XML 的应用范围也是非常广泛的,比如在 ROS(一个开源机器人操作系统)中利用 XML 来描述包的依赖关系等,当然还有很多了.      对于 XML 文档操作包括了"读"与"写",读入 XML 文档并分析的过程称为"解析" XML 文档,"解析" XML 文档在实际开发中是占很大比重的.      读写