iOS的一像素线
原文链接:http://www.jianshu.com/p/b83dca88ef73
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
时常总结以前学过的东西,才能不断向前,在这里总结一下之前遇到过的关于如何绘制一像素线的问题,我们在这里主要解决两个问题,第一个是在项目中为什么需要一像素的线?第二个是在(storyboard?)中怎样画出一像素的线?
首先为什么要画一像素的线?当我们在代码中或storyboard中设置坐标系统中的任何图形时,采用的是point来衡量。但实际渲染的时候是用像素来渲染的,只不过这之间的转换是系统自动帮我们做的,这样做的好处是我们不用关心是否是Retina屏,直接按照一套坐标设置即可。
但我们要知道在坐标系统中1 Point的线在非Retina屏幕是一个像素,在Retain屏幕上可能是2个或三个,取决于系统设置的API(屏幕的API?)
在IOS系统中,UIScreen,UIView,UIImage,CALayer都提供相关属性来获取scale factor(缩放效果),所以我们在屏幕上看到的都是缩放后的效果。因为系统自动的帮助我们处理了scale factor,例如在drawRrct方法中,UIKit自动的根据当前运动的设备设置正切的scale factor.
所以说我们在大多数情况下都不需要关注像素的转化,但是当我们要画一个只有一像素的分割线时,就需要画一个一像素的线,但是要画1个像素的线怎么画呢?按照前面的逻辑,很自然的我们在代码中首先要建一个子视图把它的高设为一个像素,然后在把它添加到父视图中,如下:
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
floatsortaPixel =1.0/[UIScreenmainScreen].scale;
UIView*line = [[UIViewalloc]initWithFrame:
CGRectMake(0,20,self.line2.frame.size.width, sortaPixel)];
line.backgroundColor=[UIColorblackColor];
[self.viewaddSubview:line];//线是否加
}
这样的话这条线的高不管iPhone5s,iphone6,6plus,确实像是1像素
那么现在问题来了,我现在仅仅是用代码创建了一条一像素的线,然后添加到父视图上,那么怎么用storyboard显示一条一像素的线呢?其实很简单,在storyboard中随意拉一条横线,把他的高随便设,自动布局约束高的值也随便设,把高的约束连到控制器中,直接
在viewdidload设置约束的值为1像素,因为viedidload是最接近显示的方法,所以这样也能得到一像素的线,如下
@property(weak,nonatomic)IBOutletNSLayoutConstraint*onePixelViewHeightConstraint;
@end
@implementationViewController
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.onePixelViewHeightConstraint.constant=1.f/[UIScreenmainScreen].scale;
}
上面我们已经做到随便拉一条线,这要在viewdidload方法里把它的高约束为1像素就可以了,慢点,等等,那我们岂不是每当需要一像素的分割线时,就得把这条线的约束拉到对应的控制器中,还得在viewdidload里给他赋值,那一个项目里得需要这样多少个分割线,又得赋多少次值呢?不敢想。
所以我们需要在storyboad中创建一个线的时候,约束好他的高为1以后,不需要连线,就可以在storyboard中直接设置它的高为1像素,怎么做呢?建一个继承NSlayoutConstraint的类,在.m awakeFromnib方法中 当当前的约束=1点时,当前的约束变成1像素,
#import"NSLayoutConstraintHairline.h"
@implementationNSLayoutConstraintHairline
-(void) awakeFromNib
{
[superawakeFromNib];
if(self.constant==1)self.constant=1/[UIScreenmainScreen].scale;
}
@end
然后让约束为1的的高(宽也行)继承的类变成约束类以后,他的宽高都变成一像素了。
iOS的一像素线的更多相关文章
- iOS开发——基础篇——iOS的一像素线
文/stark_yang(简书作者)原文链接:http://www.jianshu.com/p/b83dca88ef73著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 时常总结以前学过 ...
- iOS 绘制1像素的线
一.Point Vs Pixel iOS中当我们使用Quartz,UIKit,CoreAnimation等框架时,所有的坐标系统采用Point来衡量.系统在实际渲染到设置时会帮助我们处理Point到P ...
- [iOS]创建一像素的线
float sortaPixel = 1.0/[UIScreen mainScreen].scale; UIView* line = [[UIView alloc]initWithFrame:CGRe ...
- iOS 设置1像素的UIView线
如果是代码实现,直接 在CGRectMake里把对应的参数设置为: 1.0/[UIScreenmainScreen].scale 即可. 如果是用xib实现,就需要将对应的限制拖一个I ...
- IOS中使用像素位图(CGImageRef)对图片进行处理
IOS中对图片进行重绘处理的方法总结 一.CGImageRef是什么 CGImageRef是定义在QuartzCore框架中的一个结构体指针,用C语言编写.在CGImage.h文件中,我们可以看到下面 ...
- iOS之绘制像素到屏幕
译注:这篇文章虽然比较长,但是里面的内容还是很有价值的. 像素是如何绘制到屏幕上面的?把数据输出到屏幕的方法有很多,通过调用很多不同的framework和不同的函数.这里我们讲一下这个过程背后的东西. ...
- iOS小画板画线总结
一:基本画线: 使用贝赛尔曲线画: //创建路径 UIBezierPath* aPath = [UIBezierPath bezierPath]; //设置线宽 aPath.lineWidth = 5 ...
- iOS · UILabel加删除线
创建自定义子类DeleteLineLabel,继承自UILabel,然后在自定义子类DeleteLineLabel中 方法一(上下文): - (void)drawRect:(CGRect)rect { ...
- IOS中的多线程之GCD
在ios中,使用多线程有三种方式,分别是:NSThread.NSOperation和NSOperationQueue.GCD,在本节,主要讲解一下CDD的使用. GCD(Grand Central D ...
随机推荐
- xml解析
config.xml <?xml version="1.0" encoding="UTF-8"?> <prize> <gift&g ...
- 未能加载文件或程序集“System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件
ASP.NET 运行时错误:针对类型System.Web.Mvc.PreApplicationStartCode的应用程序邓启动初始化方法Start 引发了异常,显示下列错误消息: 未能加载文件或程序 ...
- [开源].NET数据库访问框架Chloe.ORM
扯淡 13年毕业之际,进入第一家公司实习,接触了 EntityFramework,当时就觉得这东西太牛了,访问数据库都可以做得这么轻松.优雅!毕竟那时还年轻,没见过世面.工作之前为了拿个实习机会混个工 ...
- [LeetCode] Customers Who Never Order 从未下单订购的顾客
Suppose that a website contains two tables, the Customers table and the Orders table. Write a SQL qu ...
- [LeetCode] Read N Characters Given Read4 II - Call multiple times 用Read4来读取N个字符之二 - 多次调用
The API: int read4(char *buf) reads 4 characters at a time from a file. The return value is the actu ...
- 基于ArcGIS API for Javascript的地图编辑工具
最近工作上需要用ArcGIS API for Javascript来开发一个浏览器上使用的地图编辑工具,分享一下一些相关的开发经验. 我开发的地图编辑工具是根据ESRI提供的例子修改而来的,参考的例子 ...
- java String类
String 是一个类 所以他不是基本数据类型 而是引用数据类型 String 两种实例化方式:1.直接赋值 String name = "xxxxxx";2. String na ...
- 响应式布局-Rem的用法
前言: 文章较为系统地介绍了rem这个新的文字大小单位,绝对干货,绝对好文.转载时略有改动. 先来看看一些基本理念,比如: 响应式网页不仅仅是响应不同类型的设备,而且需要响应不同的用户需求.响应式 ...
- POJ2942:Knights of the Round Table
传送门 点双练习. 很简单的一道模板题,建立反图,求出点双,二分图判定奇环. //POJ 2942 //by Cydiater //2016.11.2 #include <iostream> ...
- DOM编程的性能问题
用脚本进行DOM操作的代价很昂贵,它是富Web应用中最常见的性能瓶颈. 浏览器中的DOM:天生就慢 DOM(文档对象模型)是独立于语言的,但在浏览器中的接口是用JavaScript实现的.两个相互独立 ...