1. 程式人生 > >使用AutoLayout佈局適配時,如何提前獲得AutoLayout完成適配後的子控制元件的真實frame

使用AutoLayout佈局適配時,如何提前獲得AutoLayout完成適配後的子控制元件的真實frame

當我們使用AutoLayout做適配時,可能會有這樣的需求,就是在想在適配完成前就取得子控制元件的真實frame,來做一些操作。比如我們想把一個正方形的UIImageView剪成一個圓形,這時候就需要這麼做

self.imageView.layer.cornerRadius = self.imageView.frame.size.width / 2;
self.imageView.clipsToBounds = YES


之前我們只要把上面兩句放在layoutSubviews: 方法中設定即可,因為在layoutSubviews: 方法中,我們可以設定子控制元件的frame。但是一旦我們使用的AutoLayout適配後,在這個方法中就不能獲得子控制元件的真實frame,因為在此時,AutoLayout的適配並沒有完成。那麼這時我們就必須這麼做了:

<span style="font-size:18px;">- (void)layoutSubviews {
    [super layoutSubviews];
    
    // 不加這下面兩句,獲得的尺寸會是xib裡的未完成autolayout適配時的尺寸,storyboard同理(把這兩句寫在viewDidLoad:方法中,將contentView換成控制器的view)
    [self.contentView setNeedsLayout];
    [self.contentView layoutIfNeeded];
    
    
    // 這裡可以提前獲得autolayout完成後適配後的子控制元件的真實frame
    self.imageView.layer.cornerRadius = self.imageView.frame.size.width / 2;
    self.imageView.clipsToBounds = YES;
    
    NSLog(@"%@", NSStringFromCGRect(self.imageView.frame));
    
}</span>

實際上,AutoLayout的適配是在呼叫N次(子控制元件個數)控制器的viewDidLayoutSubviews:方法後才完成的,在stackoverflow上也有人建議在此方法中做操作。但是如果像是自定義的cell這麼去做,肯定不方便,再者關鍵是viewDidLayoutSubviews:會呼叫多次,會影響使用者體驗和效能。