根据上边栏和下边栏的高度进行布局
1 問題
從iOS7開始,視圖控制器會(huì)滲透到各種Bar下面,包括:NavigationBar、ToolBar、TabBar、StatusBar等;這些Bar會(huì)擠占視圖的空間,在布局時(shí)就需要根據(jù)各種Bar所擠占的空間大小來計(jì)算控件的frame,本案例直接在上一個(gè)案例的基礎(chǔ)上實(shí)現(xiàn),根據(jù)上邊欄和下邊欄的高度對界面進(jìn)行布局,如圖1、圖2所示:
?
2 方案
首先在上一個(gè)案例的基礎(chǔ)上增加一個(gè)NavigationController和TabBarController,在界面的中間拖放一個(gè)Button控件,標(biāo)題設(shè)置為“隱藏NavigationBar”,并將Button控件關(guān)聯(lián)成TRViewController的私有方法hideNavigationBar。
然后在ViewController類中重寫布局方法viewDidLayoutSubviews,在該方法中根據(jù)父視圖的bounds和上下邊欄的高度計(jì)算Button和Label的frame。
3 步驟
實(shí)現(xiàn)此案例需要按照如下步驟進(jìn)行。
步驟一:創(chuàng)建項(xiàng)目,添加按鈕控件
在上一個(gè)案例的基礎(chǔ)上增加一個(gè)NavigationController和TabBarController,在界面的中間拖放一個(gè)Button控件,標(biāo)題設(shè)置為“隱藏NavigationBar”,如圖3所示:
然后將Button控件關(guān)聯(lián)成ViewController的私有方法hideNavigationBar,該方法的功能是將導(dǎo)航欄隱藏或顯示,代碼如下所示:
- (IBAction)hideNavigationBar:(id)sender {
? ? self.navigationController.navigationBarHidden = !self.navigationController.navigationBarHidden;
}
步驟二:重寫布局方法viewDidLayoutSubviews,進(jìn)行界面布局
在ViewController類中重寫布局方法viewDidLayoutSubviews,在該方法中根據(jù)先通過屬性self.topLayoutGuide.length和self.bottomLayoutGuide.length獲取到上下邊欄的高度,然后再通過父視圖的bounds和上下邊欄的高度計(jì)算出Button和Label的frame,代碼如下所示:
- (void)viewDidLayoutSubviews
{
? ? [super viewDidLayoutSubviews];
? ? CGFloat buttonWidth = (self.view.bounds.size.width - 20 - 20 - 10) * 0.5;
? ? //從iOS7開始,可以隨時(shí)知道VC的上面和下面被各種Bar占據(jù)了多少的空間
? ? CGFloat top = self.topLayoutGuide.length;
? ? CGRect frame =CGRectMake(20,top+40,buttonWidth,40);
? ? self.button1.frame = frame;
?? ?
? ? frame.origin.x += buttonWidth + 10;
? ? self.button2.frame = frame;
? ? //下面的各種Bar(TabBar或ToolBar)占了VC多高的空間
? ? CGFloat bottom = self.bottomLayoutGuide.length;
? ? frame = self.label.frame;
? ? frame = CGRectMake(self.view.bounds.size.width - 20 - frame.size.width , self.view.bounds.size.height - 10 - frame.size.height - bottom, frame.size.width, frame.size.height);
? ? self.label.frame = frame;
?? ?
? ? frame = self.hideButton.frame;
? ? frame.origin.x = self.view.bounds.size.width * 0.5 - frame.size.width * 0.5;
? ? frame.origin.y = self.view.bounds.size.height * 0.5 - frame.size.height * 0.5;
? ? self.hideButton.frame = frame;
}
4 完整代碼
本案例中,ViewController.m文件中的完整代碼如下所示:
#import "ViewController.h"
?
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIButton *button1;
@property (weak, nonatomic) IBOutlet UIButton *button2;
@property (weak, nonatomic) IBOutlet UILabel *label;
@property (weak, nonatomic) IBOutlet UIButton *hideButton;
- (IBAction)hideNavigationBar:(id)sender;
@end
?
@implementation ViewController
- (void)viewDidLayoutSubviews
{
? ? [super viewDidLayoutSubviews];
? ? CGFloat buttonWidth = (self.view.bounds.size.width - 20 - 20 - 10) * 0.5;
? ? //從iOS7開始,可以隨時(shí)知道VC的上面和下面被各種Bar占據(jù)了多少的空間
? ? CGFloat top = self.topLayoutGuide.length;
? ? CGRect frame =CGRectMake(20,top+40,buttonWidth,40);
? ? self.button1.frame = frame;
?? ?
? ? frame.origin.x += buttonWidth + 10;
? ? self.button2.frame = frame;
? ? //下面的各種Bar(TabBar或ToolBar)占了VC多高的空間
? ? CGFloat bottom = self.bottomLayoutGuide.length;
? ? frame = self.label.frame;
? ? frame = CGRectMake(self.view.bounds.size.width - 20 - frame.size.width , self.view.bounds.size.height - 10 - frame.size.height - bottom, frame.size.width, frame.size.height);
? ? self.label.frame = frame;
?? ?
? ? frame = self.hideButton.frame;
? ? frame.origin.x = self.view.bounds.size.width * 0.5 - frame.size.width * 0.5;
? ? frame.origin.y = self.view.bounds.size.height * 0.5 - frame.size.height * 0.5;
? ? self.hideButton.frame = frame;
}
?
- (IBAction)hideNavigationBar:(id)sender {
? ? self.navigationController.navigationBarHidden = !self.navigationController.navigationBarHidden;
}
?
轉(zhuǎn)載于:https://www.cnblogs.com/yhj1787354782/p/5053546.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的根据上边栏和下边栏的高度进行布局的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作html标签之找到标签(续)
- 下一篇: AngularJs中,如何在ng-rep