一. 什么是scale factor
在[UIScreen mainScreen]
中有個屬性叫做scale
,這個屬性全稱為scale factor
,即比例因子.這個屬性代表了從邏輯坐標系
轉化成當前的設備坐標系
的轉化比例. UIKit
框架中的view
都有一個contentScaleFactor
的屬性,表達的意義一樣.
邏輯坐標系
即我們數學上經常用的坐標體系,是對現實事物的一種抽象.比如說我們要在app上顯示一個正方形,我們會確定它的坐標(100,100)和寬高(100,100).在這里,坐標和寬高的數值都是對這個正方形的一種抽象.在實際顯示的過程中,坐標的具體位置和寬高的實際長度則由具體硬件的物理屬性和它規(guī)定的坐標體系進行表達.在邏輯坐標系
中,以points
作為測量單位,即通常在數學的坐標系中用點
來表示最小的測量單位.
在我們進行編程時,frame
,center
中設置的表達坐標位置所使用的CGFloat
參數就是以point
為單位的.
設備坐標系
是設備實際的坐標系.在實際屏幕中,是以像素
(Pixel
)作為基本的測量單位.
由于兩個坐標系的單位不統(tǒng)一,這時需要進行坐標系的轉換.
iOS中當我們使用Quartz斥季,UIKit,CoreAnimation等框架時,所有的坐標系統(tǒng)采用Point來衡量.系統(tǒng)在實際渲染到設置時會幫助我們處理Point到Pixel的轉換.
二. 坐標系的轉換
scale
屬性反映了從邏輯坐標到設備屏幕坐標的轉換.在非視網膜屏幕上,比例因子值為1.0,即邏輯坐標系中的一個點
等于設備中一個像素(1×1)
,在視網膜屏幕中,比例因子值為2.0,即邏輯坐標系中的一個點
等于設備中四個像素(2×2)
.同理,在6plus這種scale
為3.0的設備上,1point
等于9pixels
.
因此,當我們在繪圖中做出一條線寬為1的線時,在非視網膜屏幕和視網膜屏幕上的情況是不同的.
在非視網膜屏幕中,當我們把線寬為1的線畫在(3,0)上時,線為一個像素點
的寬度(虛線部分),由于事實上不能讓一個像素點
顯示半個像素
,所以iOS的反鋸齒
技術讓1個線寬的線顯示出了2個像素
寬度的一條線(淺色部分),并且顏色變淺.只有對線進行0.5的偏移才能顯示真正的線寬為1的線.
在視網膜屏幕中,如果想要畫出寬度為一個像素
的線,不僅需要先0.5point的線寬,還要進行0.25point的偏移,才能繪出一個像素點
寬度的線.
當然,如果沒有特殊的需求,蘋果不建議使用寬度為一個像素點
的線,因為在視網膜屏幕上太細會看不清楚.