zoukankan      html  css  js  c++  java
  • iOS开发——基础篇——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的的高(宽也行)继承的类变成约束类以后,他的宽高都变成一像素了。

  • 相关阅读:
    hdu 5534(dp)
    hdu 5533(几何水)
    hdu 5532(最长上升子序列)
    *hdu 5536(字典树的运用)
    hdu 5538(水)
    假如数组接收到一个null,那么应该怎么循环输出。百度结果,都需要提前判断。否则出现空指针异常。。我还是想在数组中实现保存和输出null。
    第一个登录页面 碰到的疑问
    浅谈堆和栈的区别
    Java中的基础----堆与栈的介绍、区别
    JS的Document属性和方法
  • 原文地址:https://www.cnblogs.com/chglog/p/5322892.html
Copyright © 2011-2022 走看看