iOS的一像素線

來源:互聯網
上載者:User

標籤:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.