iOS - 处理通话或录音状态中界面错乱的重布局
2024-08-26 16:13:50
iphone设备在通话或录音状态中,状态栏下移了20个像素,这时controller的view的frame的高度就减少了20个像素,所以我们需要根据view的frame去布局子view。但是是,当状态栏还原回去的时候,系统并没有帮我们还原回去。
UIViewController的api,在ios5.0以后增加了两个函数:
– (void)viewWillLayoutSubviews – (void)viewDidLayoutSubviews
发现如果一个Controller是用系统方式压栈进去的,但系统状态栏改变的时候,会回调这个两个函数,所以我们可以在这两个函数里重新获取self.view.frame进行子view的布局。
但是通常系统的压栈方式是不符合我们的需求的,如果我们自定义一个containerViewController,例如自己的tabbarcontroller,通过addSubView的方式显示controller,就不会回调这两个函数。这时,我们就可以监听状态栏变化的通知,对view进行重布局。代码如下:
//在init的时候监听状态栏改变的通知UIApplicationDidChangeStatusBarFrameNotification -(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if(self){
[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(layoutControllerSubViews) name:UIApplicationDidChangeStatusBarFrameNotification object:nil];
}
return self;
}
我们可以在layoutControllerSubViews对controller的子view进行重布局。
最新文章
- LeetCode题目按公司分类
- 对于div的右浮动会导致顺序会改变
- TLV简介
- C#中派生类调用基类构造函数用法分析
- ListView中EditText的数据加载错乱的问题
- C#中的lock关键字;就是lock住一个大家都共同访问的(静态static的)东东就行了
- Matlab中.*和./详解
- 一个可以拖动的自定义Gridview代码
- Android之Fragment详解
- 2018-2019-2 网络对抗技术 20165206 Exp3 免杀原理与实践
- 20165306 Exp3 免杀原理与实践
- Tomcat 500error: Could not initialize class
- Apache启动不成功时,用命令行检测(新手)
- [W3bSafe]Metasploit溢出渗透内网主机辅助脚本
- 使用 Redis 共享 Session 会话
- window.location.href 与 window.loaction.replace区别
- hdu 1525 Euclid's Game【 博弈论】
- C# 数组基础
- JAVA练手--线程(Thread)
- 关于C与python交互设想及文章汇总
热门文章
- 真正的能理解CSS中的line-height,height与line-height
- libfacedetection
- C++类成员存储大小
- ThreadLocal Memory Leak in Java web application - Tomcat
- k8s SLUB: Unable to allocate memory on node -1 错误
- Django_静态文件的配置(STATIC_URL)
- 微信公众号使用vue,安卓端点击按钮404,ios访问正常问题
- docker 使用阿里云镜像加速
- java学习笔记(6)-多线程(1)
- input 标签鼠标放入输入框补全提示