iOS的一像素线

文/stark_yang(简书作者)
原文链接: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的的高(宽也行)继承的类变成约束类以后,他的宽高都变成一像素了。

时间: 2024-08-24 21:49:26

iOS的一像素线的相关文章

iOS 绘制1像素的线

一.Point Vs Pixel iOS中当我们使用Quartz,UIKit,CoreAnimation等框架时,所有的坐标系统采用Point来衡量.系统在实际渲染到设置时会帮助我们处理Point到Pixel的转换. 这样做的好处隔离变化,即我们在布局的事后不需要关注当前设备是否为Retina,直接按照一套坐标系统来布局即可. 实际使用中我们需要牢记下面这一点: One point does not necessarily correspond to one physical pixel. 1

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

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

iOS之绘制像素到屏幕

译注:这篇文章虽然比较长,但是里面的内容还是很有价值的. 像素是如何绘制到屏幕上面的?把数据输出到屏幕的方法有很多,通过调用很多不同的framework和不同的函数.这里我们讲一下这个过程背后的东西.希望能够帮助大家了解什么时候该使用什么API,特别是当遇到性能问题需要调试的时候.当然,我们这里主要讲iOS,但是事实上,很多东西也是可以应用到OSX上面的. Graphics Stack 绘制屏幕的过程中又很多都是不被人了解的.但是一旦像素被绘制到屏幕上面,那么像素就是有3种颜色组成:红绿蓝.这3

iOS · UILabel加删除线

创建自定义子类DeleteLineLabel,继承自UILabel,然后在自定义子类DeleteLineLabel中 方法一(上下文): 1 - (void)drawRect:(CGRect)rect { 2 [super drawRect:rect]; 3 4 CGContextRef ref = UIGraphicsGetCurrentContext(); 5 6 //绘制起点 7 CGContextMoveToPoint(ref, 0, rect.size.height * 0.5); 8

IOS中的多线程之GCD

在ios中,使用多线程有三种方式,分别是:NSThread.NSOperation和NSOperationQueue.GCD,在本节,主要讲解一下CDD的使用. GCD(Grand Central Dispatch) ,他是基于C语言开发的一套多线程开发机制,也是目前苹果官方推荐的多线程开发方法.GCD的抽象层次最高,用起来比较简单,但是因为它是基于C语言开发的,是面向过程的,所以在使用的时候不如面向对象的好理解.但是GCD这种机制相比较于前面两种多线程开发方式最显著的优点就是它对于多核运算更加

iOS Label添加删除线

@import url(/css/cuteeditor.css); 在做优惠价格的时候需要用到删除线,但是网上的删除线都是创建一个类继承自UILabel,然后重写drawRect方法重绘Label,其实苹果的NSAttributedString就可以实现这一点. 代码如下: NSString *lastPrice = @"¥12.25"; NSUInteger length = [lastPrice length]; NSMutableAttributedString *attri =

iOS 开发之多线程之GCD

1.GCD(Grand Centrol Dispath) 并行:宏观以及微观都是两个人再拿着两把铁锹在挖坑,一小时挖两个大坑 并发:宏观上是感觉他们都在挖坑,微观是他们是在使用一把铁锹挖坑,一小时后他们挖了两个小坑. 总结:就单个cpu来说,大部分进程是并发进行的,就是一把铁锹,你一下我一下,只是间隔时间较短,用户感觉不到而已. 应用: GCD包括: (1)实际使用中 //dispatch_get_global_queue(0, 0)第一个0是优先级,第二个保留字段 dispatch_async

iOS设备屏幕像素总览

本文永久地址为http://www.cnblogs.com/ChenYilong/p/4011728.html?,转载请注明出处. ? 本文永久地址为http://www.cnblogs.com/ChenYilong/p/4011728.html ,转载请注明出处. 技术博客http://www.cnblogs.com/ChenYilong/ ??

iOS label 添加删除线(删划线)遇到的坑

1.添加删划线方法遇到的问题 -(void)lastLabelDeal:(NSString *)str1 string:(NSString *)str2 label:(UILabel *)label{ NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@  %@",str1,str2]]; [str addAtt