文/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的的高(宽也行)继承的类变成约束类以后,他的宽高都变成一像素了。

iOS开发——基础篇——iOS的一像素线的更多相关文章

  1. iOS开发——基础篇——iOS开发 Xcode8中遇到的问题及改动

      iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...

  2. iOS开发UI篇—iOS开发中三种简单的动画设置

    iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...

  3. iOS开发UI篇—IOS开发中Xcode的一些使用技巧

    iOS开发UI篇—IOS开发中Xcode的一些使用技巧 一.快捷键的使用 经常用到的快捷键如下: 新建 shift + cmd + n     新建项目 cmd + n             新建文 ...

  4. iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)

    iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存 ...

  5. iOS开发UI篇—ios应用数据存储方式(偏好设置)

    iOS开发UI篇—ios应用数据存储方式(偏好设置) 一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用 ...

  6. iOS开发UI篇—ios应用数据存储方式(归档)

    iOS开发UI篇—ios应用数据存储方式(归档)  一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同 ...

  7. iOS开发UI篇—ios应用数据存储方式(归档) :转发

    本文转发至:文顶顶http://www.cnblogs.com/wendingding/p/3775293.html iOS开发UI篇—ios应用数据存储方式(归档)  一.简单说明 在使用plist ...

  8. iOS开发基础篇-Button基础

    一.简单介绍  UIButton 的功能:响应用户操作.显示文字.显示图片.调整内部图片和文字的位置. 二. UIButton 的状态  UIControlStateNormal :普通状态,为默认情 ...

  9. iOS开发——总结篇&IOS开发基础知识

    IOS开发基础知识 1:Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id) 对象在运行时获取其类型的能力称为内省.内省可以有多种方法实现. 判断 ...

随机推荐

  1. snowflake机器标识自动绑定

    首先附上snowflake源码 package com.yunyihenkey.common.idworker; /** * Twitter_Snowflake<br> * SnowFla ...

  2. Server.MapPath() 用法

    Server.MapPath() ./当前目录/网站主目录../上层目录~/网站虚拟目录 如果当前的网站目录为E:\wwwroot   应用程序虚拟目录为E:\wwwroot\company 浏览的页 ...

  3. 用SQLyog或Navicat远程连接数据库

    以SQLyog为例(Navicat同理): 登录远程数据库服务器查看当前存在用户:即点击用户管理器(人像图标),查看用户. 1)如果某一用户 主机一栏中是"%",则表示本用户是开放 ...

  4. mybatis保存时将数据库自动生成的主键返回

    场景 保存订单数据和订单详情数据时需要将订单的主键作为关联子段添加到明细表中,需要将保存订单时的主键返回给供保存明细表时使用 添加xml中新增数据时的配置 <insert id="in ...

  5. CodeForcesGym 100517H Hentium Scheduling

    Hentium Scheduling Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForc ...

  6. codeforces Gym 100814 A、B、F、I

    A题 先求出来这个数是第几大  阶乘求概率p  然后计算获得胜率的概率 常规解法把所有情况考虑一遍(跳1次,2次,3次……)要用到组合数  数可能太大了会爆的行不通 我们观察发现它有递推性质,从第二大 ...

  7. [bzoj2229][Zjoi2011]最小割_网络流_最小割树

    最小割 bzoj-2229 Zjoi-2011 题目大意:题目链接. 注释:略. 想法: 在这里给出最小割树的定义. 最小割树啊,就是这样一棵树.一个图的最小割树满足这棵树上任意两点之间的最小值就是原 ...

  8. CLR运行机制

    CLR编译器会将我们的代码编译成托管模块(中间IL语言和元数据),托管模块是一个标准的PE32执行文件,或者PE32+执行文件.但是CLR实际不和托管模块一起工作,他会将托管模块合并成程序集,程序集是 ...

  9. JDBC的异常

    以下内容引用自http://wiki.jikexueyuan.com/project/jdbc/exceptions.html: 异常处理可以允许处理一个异常情况,例如可控方式的程序定义错误. 当异常 ...

  10. JSTL-SQL标签库

    主页:http://www.cnblogs.com/EasonJim/p/6958992.html的分支页. 本章的前提需要先新建数据表及添加默认数据,脚本如下: -- -- 数据库: `test` ...