標籤:
文/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的一像素線