美文网首页
iOS Retina屏幕0.5pt线宽颜色失真问题

iOS Retina屏幕0.5pt线宽颜色失真问题

作者: Singularity_Lee | 来源:发表于2021-09-06 18:17 被阅读0次

项目中添加0.5pt线宽分隔线,在iPhone6/7/8(普通屏)及iPhone X(Retina屏)中显示有区别,在普通屏幕下显示正常,但在高清屏幕(右图)中会有失真现象

WX20210906-164033@2x.png
了解过是因为像素尺寸(px)跟开发尺寸(pt)区别造成的,却未仔细了解过,查询得知具体原因

在我们日常开发中,使用的frame等页面UI绘制中是以point为单位,也就是我们所说的逻辑坐标系
而在实际屏幕中是以pixel为基本测量单位,设备坐标系
因此在iOS中当我们使用Quartz,UIKit,CoreAnimation等框架时,所有的坐标系统采用Point来衡量。系统在实际渲染到设置时会帮助我们处理Point到Pixel的转换。

所以在大部分情况下我们不需要关注pixel,但在部分情况下则需要考虑到像素与点的转化,如绘制0.5pt(或是1像素)的分割线时


在非Retina屏幕中 1 point(pt)对应的就是一个像素pixel,即逻辑坐标系中的一个点等于设备中一个像素(1×1)
在Retina屏幕中 1 point(pt)对应则可能是2个或者3个,取决于系统设备的DPI,即逻辑坐标系中的一个点等于设备中四个像素(2×2),在屏幕比例scale大于等于3的设备时,1point等于9pixels


一开始处理失真的解决想法是通过屏幕比例来算出1像素对应的point,但实际结果依然没有变化,在高清屏幕中显示依旧为失真的黑色线条

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

image.png

Positions definedbywhole-numbered points fall at the midpoint between pixels.Forexample,ifyou draw a one-pixel-wide vertical linefrom(1.0,1.0)to(1.0,10.0), yougeta fuzzy grey line.Ifyou draw a two-pixel-wide line, yougeta solid black line because it fully covers two pixels (oneoneither sideofthe specified point).Asa rule, lines that are an odd numberofphysical pixels wide appear softer than lineswithwidths measuredineven numbersofphysical pixels unless you adjust their positiontomake them cover pixels fully.

因此要解决Retina屏幕中设置一条0.5pt线条因反锯齿原因造成的线条失真问题时,需同时设置0.25point(0.5像素)的偏移,这样系统渲染的时候刚好可以填充完整一像素,也就是得到一条标准像素颜色变化的线条

#define APP_LINE_WIDTH    ([UIScreen scrnScale] >= 3 ? 0.75 : 0.5)

如果线宽为偶数Point的话,则不要去设置偏移,否则线条也会失真
如果没有特殊的需求,苹果不建议使用宽度为一个像素点的线,因为在视网膜屏幕上太细会看不清楚


image.png

Ona low-resolution display (witha scale factorof1.0), a one-point-wide lineisone pixel wide.Toavoid antialiasingwhenyou draw a one-point-wide horizontalorvertical line,ifthe lineisan odd numberofpixelsinwidth, you must offset the positionby0.5pointstoeither sideofa whole-numbered position.Ifthe lineisan even numberofpointsinwidth,toavoid a fuzzy line, you mustnotdoso.Ona high-resolution display (witha scale factorof2.0), a line thatisone point wideisnotantialiased at all because it occupies two full pixels (from-0.5to+0.5).Todraw a line that covers only asinglephysical pixel, you would needtomake it0.5pointsinthicknessandoffset its positionby0.25points. A comparison between the two typesofscreensisshowninFigure1-4.

相关文章

  • iOS Retina屏幕0.5pt线宽颜色失真问题

    项目中添加0.5pt线宽分隔线,在iPhone6/7/8(普通屏)及iPhone X(Retina屏)中显示有区别...

  • iOS上传图片颜色失真问题

    app上传前的原图与上传后CDN上压缩图对比颜色有失真具体描述可见:拒绝黯淡!教你还原iPhone 7照片本色 问...

  • 了解Retina屏幕和Retina屏幕下图片的显示问题

    今天被问到关于像素的问题,怒补了一下。 retina的原意是视网膜,retina屏就是通过技术把更多的像素点压缩到...

  • 1px

    CSS中1px分割线处理移动web开发之像素和DPR详解7种方法解决移动端Retina屏幕1px边框问题IOS基础...

  • web常用库

    js retina.js 实现retina屏幕图片自动替换 slick.js jQuery插件,实现各种轮播图 w...

  • 前端开发之——网页如何适配Retina屏幕

    前言 随着2012年苹果发布第一款Retina Macbook Pro(以下简称RMBP),Retina屏幕开始进...

  • Retina 屏幕 and 启动图标

    2.应用程序启动图片 一个app在启动过程中会全屏显示叫做Default.png的图片 不同规格Default的使用场合

  • 关于App闪图

    闪图尺寸 iOS iPhone5/5s Retina4640*1136 iPhone6 Retina HD 4.7...

  • 屏幕旋转

    屏幕旋转 推荐文档 了解UIWindow——UIWindow实践 iOS屏幕旋转问题总结 IOS:屏幕旋转与变换 ...

  • app 启动页尺寸

    001 ios11+iPhoneX : 1125*2436 ios8+Retina HD 5.5:12422208...

网友评论

      本文标题:iOS Retina屏幕0.5pt线宽颜色失真问题

      本文链接:https://www.haomeiwen.com/subject/oxzewltx.html