UIViewController及其子類,都會調(diào)用loadView進行處理,本文是詳解iOS中UIView的layoutSubviews子視圖布局方法使用,大家都了解嗎?一起跟著武林技術(shù)頻道小編的步伐來學(xué)習(xí)吧!
概念
在UIView里面有一個方法layoutSubviews:
layoutSubviews方法的具體作用
layoutSubviews是對subviews重新布局。比如,我們想更新子視圖的位置的時候,可以通過調(diào)用layoutSubviews方法,既可以實現(xiàn)對子視圖重新布局。
layoutSubviews默認(rèn)是不做任何事情的,用到的時候,需要在自雷進行重寫。
?
實例
由于ipad的橫豎屏不同,所以好的應(yīng)用,橫豎屏的頁面布局也不一樣。那么就需要橫豎屏的整體解決方案。先看一個橫豎屏布局不一樣的界面。
下面兩張圖是來自同一個界面的橫豎版的截屏。可以看出,橫豎版顯示的內(nèi)容相同,但是界面布局不同。要實現(xiàn)上述布局,主要是運用UIView中 layoutSubviews方法。當(dāng)UIView設(shè)置為自動適配屏幕時,當(dāng)用戶旋轉(zhuǎn)設(shè)備的時候,會調(diào)用layoutSubviews方法,我們只需重寫 這個方法,然后判斷用戶屏幕的方向。在調(diào)整每個空間的位置即可。


下面是實現(xiàn)上述界面的最簡單的原型:
首先分析可以知道左面是圖片,右面是一個圖片加文字的視圖。下面就實現(xiàn)一個左面視圖右面是一個圖加一段字的事例。
事例的截圖如下


其中右面的文字和綠色部分是用一個子視圖封裝的。
整個布局是我在主視圖中添加了一個ContentView視圖,在ContentView視圖中添加了一個ArticleView視圖。
其中ArticleView和ContentView的xib文件都打開了

在ContentView中重寫layoutSubviews方法,然后根據(jù)stausbar的方向判斷當(dāng)前視圖的橫豎屏。具體代碼:
?
-(void)setVerticalFrame
{
NSLog(@"豎屏");
[titleLable setFrame:CGRectMake(283, 0, 239, 83)];
[leftView setFrame:CGRectMake(38, 102, 384, 272)];
[rightView setFrame:CGRectMake(450, 102, 282, 198)];
}
-(void)setHorizontalFrame
{
NSLog(@"橫屏");
[titleLable setFrame:CGRectMake(183, 0, 239, 83)];
[leftView setFrame:CGRectMake(168, 122, 384, 272)];
[rightView setFrame:CGRectMake(650, 122, 282, 198)];
}
在具體的橫豎屏方法中,從新設(shè)置各個組件的坐標(biāo)即可。
?
接下來在ContentView中添加ArticleView視圖。
?
NSArray *arrayContentView =[[NSBundle mainBundle] loadNibNamed:@"ArticleView" owner:self options:nil];
rightView=[arrayContentView objectAtIndex:0];
[self addSubview:rightView];
}
return self;
}
由于我用的是xib,所以初始化方法為initWithCoder,在這個中添加新的視圖。
?
同樣在ArticleView中設(shè)置橫豎屏相應(yīng)空間的坐標(biāo)即可。
?
-(void)setVerticalFrame
{
NSLog(@"豎屏");
[contentView setFrame:CGRectMake(12, 6, 250, 125)];
[textLable setFrame:CGRectMake(50, 139, 182, 39)];
}
-(void)setHorizontalFrame
{
NSLog(@"橫屏");
[contentView setFrame:CGRectMake(12, 6, 106, 158)];
[textLable setFrame:CGRectMake(135, 11, 147, 39)];
}
?
總結(jié)
layoutSubviews以下情況會被調(diào)用:
蘋果官方文檔已經(jīng)強調(diào),不能直接調(diào)用layoutSubviews對子視圖進行重新布局。那么,layoutSubviews什么情況下會被調(diào)用呢?通過百度搜索,發(fā)現(xiàn)以下幾種情況layoutSubviews會被調(diào)用。
我簡單測試了一下,上面基本都會被調(diào)用。 注意:
當(dāng)view的fram的值為0的時候,`addSubview`也不會調(diào)用`layoutSubviews`的。
layoutSubviews方法在對自雷視圖進行布局的時候非常方便。可以自己動手,深入理解layoutSubviews的調(diào)用機制。
以上就是武林技術(shù)頻道小編給大家介紹的詳解iOS中UIView的layoutSubviews子視圖布局方法使用,大家了解了多少呢?更多的技術(shù)知識希望大家繼續(xù)關(guān)注武林技術(shù)頻道!
新聞熱點
疑難解答
圖片精選