2015-08-25 70 views
1

當使用auto layout時,視圖的大小在初始化時是未知的,這給我帶來了一個問題。iOS:UIView可以知道它的佈局過程已完成嗎?

當使用UIImageView,我寫了一個類,可以通過圖像URL不同大小設置爲UIImageView,我​​存儲一個圖像,以區別設備可以加載它真正需要的尺寸從我自己的​​加載圖像。

我想讓我的UIImageView能夠加載所需分辨率的URL,但是當我的UIImageView獲取該URL時,其大小尚未由auto layout決定。

那麼有沒有辦法讓UIView知道它的佈局過程第一次完成?

回答

4

有一個UIView的方法,你可以覆蓋它。

-(void)layoutSubviews { 
    CGRect bounds =self.bounds; 
    //build your imageView's frame here 
    self.imageView=imageViewFrame. 
} 
0

不幸的是,沒有簡單的方法可以通知UIView已經設置了它的約束條件。你可以嘗試一堆不同的東西,但是,

實現layoutSubviews功能UIView,這是每當UIView的佈局被改變時調用。

執行的viewDidLayoutSubviews它有它。此功能在所有佈局設置完成後調用。此時,您可以使用您的類別功能。

-1

這裏是一個測試,我只使用自動佈局,我只使用自定義子類的子視圖。我在子類的初始化所有的汽車佈局:

這是一個「登錄按鈕」有沒有框架,但隨後與自動佈局設置:

-(void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 
    if (self.contentView.loginButton.frame.size.height) { 
     NSLog(@"viewDidLayoutSubviews"); 
    } 
} 

-(void)viewWillLayoutSubviews { 
    [super viewWillLayoutSubviews]; 
    if (self.contentView.loginButton.frame.size.height) { 
     NSLog(@"viewWillLayoutSubviews"); 
    } 
} 

-(void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
} 

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    if (self.contentView.loginButton.frame.size.height) { 
     NSLog(@"didAppear"); 
    } 
} 

-(void)viewWillAppear:(BOOL)animated { 
    if (self.contentView.loginButton.frame.size.height) { 
     NSLog(@"viewWillAppear"); 
    } 
} 

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    if (self.contentView.loginButton.frame.size.height) { 
     NSLog(@"viewDidLoad"); 
    } 
} 

這裏的輸出。所以,這意味着,我認爲終於有一個幀時的

2015年8月25日01:28:27.789 [67502:1183631] viewDidLayoutSubviews

2015年8月25日01:28:27.790 [ 67502:1183631] viewWillLayoutSubviews

2015年8月25日01:28:27.790 [67502:1183631] viewDidLayoutSubviews

2015年8月25日01:28:28.007 [67502:1183631] didAppear

這意味着第一次登錄按鈕有一個框架在viewDidLayoutSubviews中,這看起來很奇怪,因爲這是主視圖子視圖的第一遍。 ViewWillAppear中沒有框架,儘管viewcontroller本身的視圖已經設置在登錄按鈕之前。當viewcontroler的視圖被設置時,整個UIView子類的主視圖也被設置,這也發生在登錄按鈕之前。因此,視圖的子視圖是在父視圖設置後設置的。

重點是這樣的:如果你在viewDidLayoutSubviews中放置了imageview信息拉,那麼你就有一個框架可以使用,除非你通過類型轉換將這個UIImageView框架設置爲ViewController的視圖,那麼你將擁有UIImageView的框架在viewDidLoad中設置。祝你好運!

+1

那麼酷和東西,但'UIView'!='UIViewController' – Laszlo

相關問題