目标控制器需求:使用自动布局,让两行按钮在屏幕上,三个等高的间距,且隐藏TabBar。
问题描述:
在模拟器中,从来源控制器Push到目标控制器,跳转后的界面的布局控件从上往下移动。
出现问题的方法:
1.目标控制器的view的背景图片,自定义一个UIview,使用drawRect:方法把图片画上去。
- (void)drawRect:(CGRect)rect {
UIImage *image = [UIImage imageNamed:@"luck_entry_background"];
[image drawInRect:rect];
}
2.在storyboard中,先添加三个view,用这三个view平分屏幕,间隔为按钮的高,三个按钮的高不固定且相等。
3.在前三个view的间隔中布局所要添加的按钮。
4.设置三个按钮的颜色为透明,并在storyboard的属性栏,勾选隐藏TabBar。
模拟器运行结果:来源控制器Push到目标控制器后,界面上的控件从上往下移动。
问题原因:从来源控制器Push到目标控制器时,目标控制器的TabBar隐藏没有及时执行,当从storyboard中加载完目标控制的view后才去执行。在有navigationBar和TabBar的情况下,view的高是屏幕的高减去navigationBar和TabBar的高。当view显示后,TabBar隐藏,view的高变大,view就会重新布局,所以屏幕会有向下移动。
解决问题:控制器的view将要显示时,就会调用控制器的viewWillLayoutSubviews方法进行布局,所以只要在viewWillLayoutSubviews方法中提前让view的高加上TabBar的高就可以。如果只加上高,虽然屏幕上得控件不移动了,但是背景图片是画上去的,当屏幕尺寸改变时,背景会有拉伸的效果,解决的方法是背景图片不要画上去,应该在storyboard中,在view底部插入一个UIImageView做为背景图片,布局上下左右距离边框为0。
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
CGFloat tabBarH = self.tabBarController.tabBar.bounds.size.height;
// 提前让view的高加上TabBar,防止重新布局后界面移动
self.view.height += tabBarH;
}