Auto Layout
使布局變得簡單柜思、方便赔硫、從iOS12開始變得更加高效炒俱,目前來看Auto Layout
已經(jīng)非常的完善了,簡書一搜爪膊,一大堆的教程向胡,各種花式的教程,我就不在這里貼出了惊完,主要是解決一些關(guān)于Auto Layout
的bug
僵芹。
今天說的是在使用Auto Layout
布局完成以后,因?yàn)樵蛨D圖內(nèi)有個(gè)虛線的邊框小槐,所以直接將view拖拽為屬性拇派,使用UIBezierPath
進(jìn)行代碼編寫,虛線很簡單凿跳,代碼如下:
/// 增加虛線
/// @param pDottedLine addview 原文虛線方法轉(zhuǎn)自:http://www.reibang.com/p/12b439443b3b
/// @param pStrokeColor 虛線的顏色
/// @param pFillColor 填充的顏色
/// @param pCornerRadius 設(shè)置圓角
- (void)addDottedLine:(UIView *)pDottedLine withStrokeColor:(CGColorRef)pStrokeColor withFillColor:(CGColorRef)pFillColor withCornerRadius:(CGFloat)pCornerRadius{
CAShapeLayer *border = [CAShapeLayer layer];
//虛線的顏色
border.strokeColor = pStrokeColor;
//填充的顏色
border.fillColor = pFillColor;
//要是設(shè)置圓角則 cornerRadius: x
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:pDottedLine.bounds cornerRadius:pCornerRadius];
//設(shè)置路徑
border.path = path.CGPath;
border.frame = pDottedLine.bounds;
//虛線的寬度
border.lineWidth = 1.f;
//設(shè)置線條的樣式
// border.lineCap = @"square";
//虛線的間隔
border.lineDashPattern = @[@4, @2];
//self.lineButton.layer.cornerRadius = 5.f;
//self.lineButton.layer.masksToBounds = YES;
[pDottedLine.layer addSublayer:border];
}
但是在使用的時(shí)候發(fā)現(xiàn)設(shè)置的虛線運(yùn)行的時(shí)候竟然僅僅是xib
的frame
的大小件豌,而Auto Layout
并沒有出現(xiàn)效果,在不同的設(shè)備上切換控嗜,發(fā)現(xiàn)了這一個(gè)bug
,除非將此方法放到viewDidAppear:
方法內(nèi)茧彤,但是放到viewDidAppear:
根據(jù)控制器的生命周期來看,會(huì)出現(xiàn)閃爍疆栏,原因也是很簡單曾掂,因?yàn)樵?code>viewDidAppear:中UI
已經(jīng)完成惫谤,再要使用UIBezierPath
肯定會(huì)出現(xiàn)閃爍,后來想Auto Layout
應(yīng)該是有一個(gè)立即更新UI
的方法珠洗,后來看UIView
的頭文件溜歪,發(fā)現(xiàn)了setNeedsLayout
、layoutIfNeeded
這2個(gè)方法许蓖,api中如下:
// Allows you to perform layout before the drawing cycle happens. -layoutIfNeeded forces layout early
- (void)setNeedsLayout;
- (void)layoutIfNeeded;
又在 stackoverflow 中找到了更加詳細(xì)的說明蝴猪,故在使用Auto Layout
布局時(shí),要有后期使用代碼修改UI
的時(shí)候膊爪,要先調(diào)用layoutIfNeeded
方法自阱。在進(jìn)行修改UI
則運(yùn)行以后就會(huì)遵守Auto Layout
了,不會(huì)出現(xiàn)在不同設(shè)備上出現(xiàn)偏移的問題米酬,當(dāng)然在切圓角時(shí)也發(fā)現(xiàn)了同樣的問題动壤,提前調(diào)用layoutIfNeeded
在進(jìn)行切圓角,即[self.xxx layoutIfNeeded];
即可淮逻。
本文引用如下文章:
stackoverflow - How is layoutIfNeeded used?
setNeedsLayout和layoutIfNeeded看我就懂琼懊!
bug
效果圖如下: