iOS_如何画1px的线

本文探讨了在iOS中如何正确绘制1px线条,包括在drawRect方法中关闭抗锯齿,理解Point与Pixel的区别,以及在不同屏幕缩放因子下如何调整线条位置。还提供了一个宏来绘制1px线,并分享了一个防止线条模糊的GridView代码示例。
摘要由CSDN通过智能技术生成

在drawRect方法里面,默认抗锯齿是开着的,关闭即可

// 核心代码 关闭抗锯齿即可

    CGContextSetAllowsAntialiasing(context,NO);


在CALayer里面,抗锯齿默认是关闭的,所以view.layer.borderWidth = 0.5即可

/**
 *  @programmer beyond
 
 *  @brief  画分割线
 
 *  @return
 
 *  @param
 
 */
- (void)drawLine:(CGRect)rect
{
    
    
    // 1.获得图形上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    // 核心代码 关闭抗锯齿即可
    CGContextSetAllowsAntialiasing(ctx,NO);
    // 2.拼接图形(路径)
    // 设置线段宽度
    CGContextSetLineWidth(ctx,  0.5);
    
    // 设置线段头尾部的样式
    CGContextSetLineCap(ctx, kCGLineCapRound);
    
    // 设置线段转折点的样式
    CGContextSetLineJoin(ctx, kCGLineJoinRound);
    
    /**  第1根线段  **/
    // 设置颜色
    CGContextSetRGBStrokeColor(ctx, 0/255.0, 0/255.0, 0/255.0, 1);
    // 设置一个起点
    CGContextMoveToPoint(ctx, 0, rect.size.height - 15);
    // 添加一条线段到(100, 100)
    CGContextAddLineToPoint(ctx, rect.size.width, rect.size.height - 15);
    
    // 渲染一次
    CGContextStrokePath(ctx);
    
    
    
}




附上一篇博文





一、Point Vs Pixel

iOS中当我们使用Quartz,UIKit,CoreAnimation等框架时,所有的坐标系统采用Point来衡量。系统在实际渲染到设置时会帮助我们处理Point到Pixel的转换。
这样做的好处隔离变化,即我们在布局的事后不需要关注当前设备是否为Retina,直接按照一套坐标系统来布局即可。

实际使用中我们需要牢记下面这一点:

One point does not necessarily correspond to one physical pixel.

1 Point的线在非Retina屏幕则是一个像素,在Retina屏幕上则可能是2个或者3个,取决于系统设备的DPI。

iOS系统中,UIScreen,UIView,UIImage,CALayer类都提供相关属性来获取scale factor。
原生的绘制技术天然的帮我们处理了scale factor,例如在drawRect:方法中,UIKit自动的根据当前运行的设备设置了正切的scale factor。所以我们在drawRect: 方法中绘制的任何内容都会被自动缩放到设备的物理屏幕上。

基于以上信息可以看出,我们大部分情况下都不需要去关注pixel,然而存在部分情况需要考虑像素的转化。

例如画1个像素的分割线

看到这个问题你的第一想法可能是,直接根据当前屏幕的缩放因子计算出1 像素线对应的Point,然后设置线宽即可。
代码如下:

1.f / [UIScreen mainScreen].scale

表面上看着一切正常了,但是通过实际的设备测试你会发现渲染出来的线宽并不是1个像素。

Why?

为了获得良好的视觉效果,绘图系统通常都会采用一个叫“antialiasing(反锯齿)”的技术,iOS也不例外。
显示屏幕有很多小的显示单元组成,可以接单的理解为一个单元就代表一个像素。如果要画一条黑线,条线刚好落在了一列或者一行显示显示单元之内,将会渲染出标准的一个像素的黑线。
但如果线落在了两个行或列的中间时,那么会得到一条“失真”的线,其实是两个像素宽的灰线。

如下图所示:


                
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值