问题描述:
当iPhone打开热点分享时,屏幕整体会下移20pt,导致对应的controller.view的高度减小20,当热点关闭后,屏幕上移,view恢复原来的高度。demo下载地址
解决办法:
1.用masonry做好约束处理。例如:放置一个距离底部10的bottomview的话,如果高度相对位置的话,当热点分享打开,父视图整体下移,就会遮挡住一部分bottomview,如果用masonry做约束来添加的话,就不会出现这个问题。但是要注意的是,当mas采用从上到下的布局时,要规划好纵向上的约束问题,例如纵向方向上的约束优先级设置,防止再次出现视图下移时被遮挡的问题。
2.监听系统状态栏的改变,计算出每次view高度的该变量将其作用在子view的y上,自己对子视图做相应处理。如果用frame布局的话,如下
CGFloat height = self.view.frame.size.height;
CGFloat width = self.view.frame.size.width;
oldHeight = height;
self.bottomView = [[UIView alloc]initWithFrame:CGRectMake(10, height-40, width-20, 40)];
self.bottomView.backgroundColor = [UIColor redColor];
[self.view addSubview:self.bottomView];
要添加如下通知
[[ NSNotificationCenter defaultCenter] addObserver:self selector:@selector(layoutControllerSubViews) name: UIApplicationDidChangeStatusBarFrameNotification object : nil ];
并在触发方法里实现对子视图的重新布局
- (void)layoutControllerSubViews
{
self.logLabel.text = [NSString stringWithFormat:@"%f" ,self.view.frame.size.height];
//当状态栏的高度变化后,因为view的高度会变小20,所以要重新获取view的高度刷新子视图的高度
CGFloat newHeight = self.view.frame.size.height;
CGRect frame = self.bottomView.frame;
frame.origin.y += newHeight-oldHeight;
self.bottomView.frame = frame;
oldHeight = newHeight;
}
3.使用VC自带的方法。
- (void)viewWillLayoutSubviews
在这个方法里处理基本上跟第二种方法处理的一样。