我們?cè)趯慤I界面的時(shí)候有時(shí)會(huì)需要繪制一根 1pixel 的線來(lái)充當(dāng)分隔線,類似UITableView 各個(gè) cell 之間的分隔線。通常我們可以通過(guò)添加一個(gè) view 來(lái)實(shí)現(xiàn),如果是橫線,就設(shè)定這個(gè)view 的高度為 1pexil,如果是豎線,就設(shè)其寬度為 1pixel,注意此處的單位是 pixel,即像素。由于在 retina 屏幕中,iOS坐標(biāo)系中的一個(gè)點(diǎn)(point)的大小并不等于1個(gè)像素,在4/4s、5/5s、6/6s中,1point == 2pixel,而在 6plus/6splus 上,1point == 3pixel,因此實(shí)際上我們想要繪制 1pixel 的線,需要設(shè)置的高度和寬度是0.5或者 1/3,也就是 < 1的。這在代碼布局中很好辦到,直接寫上小數(shù)就可以了。但是在 xib 中,這就是一個(gè)問(wèn)題了,因?yàn)?xib 中設(shè)置寬高,或者約束的時(shí)候,即使輸入小數(shù),系統(tǒng)也會(huì)自動(dòng)給我們四舍五入,轉(zhuǎn)換成整數(shù),這就給我們?cè)O(shè)置 1pixel 的線帶來(lái)了麻煩。
我在 Google 中查了一下這個(gè)問(wèn)題,最終找到了一個(gè)相對(duì)簡(jiǎn)單的解決方案:
首先創(chuàng)建 NSLayoutConstraint 的子類 NSLayoutConstraintOnePixelLine
// NSLayoutConstraintOnePixelLine.m
#import"NSLayoutConstraintOnePixelLine.h"
@implementation NSLayoutConstraintOnePixelLine
- (void)awakeFromNib {
[super awakeFromNib];
if (self.constant == 1) {
self.constant = 1 / [UIScreen mainScreen].scale;
}
}
@end
然后給我們想要設(shè)置為 1pixel 的 view 設(shè)置上約束,大小為 1。
再把該約束所屬的類改成剛剛寫的子類就可以了。

用這種方法,通過(guò)修改代碼中的 constant 屬性的值,我們就可以任意修改其他約束的值。
