當(dāng)我們使用AutoLayout做適配時(shí)排嫌,可能會(huì)有這樣的需求施流,就是在想在適配完成前就取得子控件的真實(shí)frame踪宠,來做一些操作冲泥。比如我們想把一個(gè)正方形的UIImageView剪成一個(gè)圓形窘茁,這時(shí)候就需要這么做
self.imageView.layer.cornerRadius = self.imageView.frame.size.width / 2;
self.imageView.clipsToBounds = YES
之前我們只要把上面兩句放在layoutSubviews: 方法中設(shè)置即可怀伦,因?yàn)樵趌ayoutSubviews: 方法中,我們可以設(shè)置子控件的frame山林。但是一旦我們使用的AutoLayout適配后房待,在這個(gè)方法中就不能獲得子控件的真實(shí)frame,因?yàn)樵诖藭r(shí)驼抹,AutoLayout的適配并沒有完成桑孩。那么這時(shí)我們就必須這么做了:
- (void)layoutSubviews {
[super layoutSubviews];
# 不加這下面兩句,獲得的尺寸會(huì)是xib里的未完成autolayout適配時(shí)的尺寸
# storyboard同理(把這兩句寫在viewDidLoad:方法中框冀,將contentView換成控制器的view)
[self.contentView setNeedsLayout];
[self.contentView layoutIfNeeded];
# 這里可以提前獲得autolayout完成后適配后的子控件的真實(shí)frame
self.imageView.layer.cornerRadius = self.imageView.frame.size.width / 2;
self.imageView.clipsToBounds = YES;
NSLog(@"%@", NSStringFromCGRect(self.imageView.frame));
}
總結(jié):AutoLayout的適配是在調(diào)用N次(子控件個(gè)數(shù))控制器的viewDidLayoutSubviews:方法后才完成的流椒,在stackoverflow上也有人建議在此方法中做操作。但是如果像是自定義的cell這么去做明也,肯定不方便宣虾,再者關(guān)鍵是viewDidLayoutSubviews:會(huì)調(diào)用多次,會(huì)影響用戶體驗(yàn)和性能温数。