iOS 多window statusbar rotation 控制

iOS开发-Status Bar设置汇总 Status bar 状态栏的隐藏 1. Info.plist 设置状态栏的全局隐藏 在Info.plist中添加Status bar is initially hidden设置为YES,隐藏LunchScreen(启动界面)的状态栏。 在 Info.plist中添加 View controller-based status bar appearance 设置为 NO,隐藏... 阅读详情

一、问题的产生

临近发版时,同事突然找我帮忙看一个statusbar旋转的问题:应用主页只支持竖屏(有子页面需要横屏,所以app还是需要支持portrait、landscapeLeft、landscapeRight三个方向),打卡手机的横竖屏锁,旋转手机,只支持 portrait 的首页的statusbar方向竟然发生了旋转。

二、问题的定位

发现这个问题,菊花一紧,赶紧下了一个appstore线上包,发现是好的,万幸万幸!线上是好的,问题一定是最近的修改导致的,下面记录一下问题定位的过程:
1,查看了一下工程plist,一切正常。
2,把当前的podfile和线上包所用的podfile进行比较,发现除了各个子模块升级外,仅仅引入了一个新的子模块,从名字看,是与一些数据统计相关的库。
3,经过2的分析,我猜测大概率是某个兄弟姐妹在升级模块的时候,搞了与旋转相关的事情,在钉钉群里@所有人,问是否有人改过,得到的回到是NO,这就奇怪了。
4,当所有人都说没改过这块的时候,我是持怀疑态度的,心想一定要找出是谁改的,于是down下来所有模块的代码,添加了 [UIViewController shouldAutoRotate] 的符号断点,并在时间里面加上了堆栈输出,可惜没有得到有用的信息,在符号断点执行时,执行 po self, 结果告诉我 self 没有定义,想通过符号断点来确定调用位置的办法落空了。
5,此时,一个上午已经过去了,很迷茫,下午吃完饭,搜了一下各种statusbar旋转的case,和我遇到的现象差异很大,心里开始着急了,用英文在stackoverflow上搜索,说多window时,可能会影响到旋转,这我觉得有可能,赶紧在代码上打了个断点,并执行:po [UIApplication sharedApplication].windows,不执行不知道,一执行吓了一跳,竟然有3个window,其中一个竟然是数据统计相关库的window,心想,大概就是这个window的锅了,在podfile中注释掉这个库、注释掉调用这个库的方法,重新运行,发现一切正常,OK,由此,定位到问题了,but why?

三、问题的分析

在(二)中,我找到了出问题的地方,但是对于为什么会出现这种情况,却不知道,要搞清楚这个问题,需要搞一个多window的demo来进行验证,在github上搜索 multiple UIWindow,找到一个demo,https://github.com/y310/MultiWindowSample 在这个demo上稍作修改,并给 MWSViewController、MWSSubWindowViewController都添加了方法:

- (BOOL)shouldAutorotate{
    return NO;
}

对window进行选择,视图也随着旋转,statusbar位置正常。

接下来我要让多window生效了,在MWSSubWindowViewController 中,将shouldAutorotate的返回值改为YES,点击 showWindow按钮,旋转手机,发现MWSSubWindowViewController和statusbar都旋转了。

然后,我再做一下修改,将MWSViewController中的 shouldAutorotate 设置为YES,而 MWSSubWindowViewController 中的 shouldAutorotate 设置为NO,点击 showWindow按钮,旋转手机,发现MWSSubWindowViewController没有旋转,而statusbar和MWSViewController旋转了,页面混乱。到此时,我们就可以明白,如果MWSSubWindowViewController 不是半透明的话,statusbar 相对于 MWSSubWindowViewController 就对不上了。

此时的现象,已经可以解释我们出现的statusbar异常的问题了。但是还是略有差异,因为我们的可见window只有一个,需要再做修改:在 MWSViewController 中,将 shouldAutorotate 改为返回NO;修改 openWindow:(id)sender 方法,注释掉 [self.window makeKeyAndVisible]; 即,我们不让subwindow显示出来。将MWSSubWindowViewController中,将shouldAutorotate 改为返回YES,运行工程:

- (IBAction)openWindow:(id)sender {
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    MWSSubWindowViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SubWindow"];
    controller.window = self.window;
    self.window.rootViewController = controller;
//    [self.window makeKeyAndVisible];
}

点击 MWSViewController 上的show window 按钮,还是停留在MWSViewController之上,这时再旋转手机,statusbar 与内容对不上了,问题复现。

四、问题的知识点总结

1,VC自己是否旋转,由VC自己的 shouldAutorotate 方法决定。
2,statusbar 是否旋转,由所有的多 window 的 rootViewController 的 shouldAutorotate 共同决定。

iOS中关于UIWindow和statusbar的设置问题 最近在做开发时要做一个类似于UIAlertView的控件,做法是创建一个基于UIView的类,在里面进行自定义控件的设置,为了尽量模仿UIAlertView,在这个类里面创建了一个新的UIWindow并将self显示到这个window上 立即下载

相关推荐

XGBoost算法案例 - 红酒品质分类

数据集共包含 11 个特征,共计 3269 条数据. 我们通过训练模型来预测红酒的品质, 品质共有 6 个各类别,分别使用数字: 0、1、2、3、4、5 来表示。

YIAN爱学习的博客 449

浅谈iOS的多Window处理

概述 想必做iOS的人都知道,我们的App是通过UIWindow这个载体呈现出来的。默认情况下,iOS App对于开发者来说只有一个UIWindow,也就是AppDelegate在applicationDidFinishLaunching里面创建出来的。 但是即使我们什么都不做,在我们的APP里面也会有其他的UIWindow: 键盘对应的UITextE...

weixin_33670713的博客 1957

从Chimera到ChimeraX:科研绘图升级指南,让你的论文配图更专业

本文详细介绍了从UCSF Chimera升级到ChimeraX的科研绘图指南,帮助研究者提升论文配图质量。ChimeraX在渲染引擎、大分子处理能力和动画功能上具有显著优势,特别适合生命科学和结构生物学领域。文章涵盖材质设置、专业配色、工作流程和期刊适配等核心技巧,助力产出出版级分子可视化图像。

weixin_33670786的博客 928

ios13多窗口(UIWindowScene)学习笔记

ios13引入了UIWindowScene类、UIWindowSceneDelegate协议以便支持多窗口功能,但其适用于ipad,不适用于iphone,因为iphone不支持多窗口功能。注意,这里说的窗口不是UIWindow,而是UIWindowScene。

u010919133的专栏 3281

(9-2)离线强化学习:离线强化学习的主流方法

本文介绍了三种离线强化学习的主流约束策略优化方法:BCQ、CQL和Fisher-BRC,并通过CartPole环境进行性能比较。BCQ利用生成模型约束动作选择并引入扰动网络;CQL通过正则化Q值抑制对未见状态-动作对的高估;Fisher-BRC使用Fisher散度正则化策略分布。实验结果表明,三种方法各有优势,其中CQL表现最为稳定。文章还指出,为获得更好的性能,需要更大的数据集和更长的训练轮次。这些方法通过限制策略优化范围,有效提高了离线强化学习的稳定性和泛化能力。

码农三叔 1537

IMX6ULL---从零开始移植uboot-imx

IMX6ULL---从零开始移植uboot-imx

weixin_42162924的博客 1028

iOS 13 Scene Delegate and multiple windows

iOS 13 Scene Delegate and multiple windows iOS 13的一大改进就是支持multiple windows(多窗口)功能,虽然多窗口仅在iPadOS上获得支持,但这已经是一个很大到的进步,它将会大大提升一些场景的使用体验。本文将结合WWDC 2019相关topic介绍与多窗口相关的内容。 Scene Delegate 为了实现多窗口功能,苹果修改了使用...

集腋成裘 2651

基于GA-BP遗传算法优化神经网络的多输入多输出数据预测-Python代码实现

多输入多输出的GA-BP神经网络

2301_80449389的博客 2306

app启动页数秒加载 代码_一次有意思的技术降级,iOS 启动广告,直接 push,首页不出现

PM 提了个需求,启动广告界面点击了, 就直接进,不需要闪一下主界面。要这种:实现的思路,多 window 模式一般的广告界面就是 Key Window 上面的遮罩(子视图)。要从广告界面 push,自然广告界面是一个控制器了。 提升广告界面的层级,才可以。这里提升为 window 。然后就是切换展示的窗口了,通过系统单例 AppDelegate , [delegate.window makeKe...

weixin_39731456的博客 232

uniapp - 解决在线预览PDF文件空白打不开的问题,无论是后端下载二进制文件流pdf还是本地插件或JS预览查看打开白屏不显示,详细排查解决(适用于移动端H5网页、安卓/苹果app、微信小程序)

uniapp App端 实现pdf文件预览打开白屏解决,uniapp 在线预览pdf打开一片空白,跨域白屏,uni-app中使用WebView预览PDF文件打开空白,微信小程序(uniapp)预览PDF空白怎么办,下载PDF文件流后打开空白或无法打开的问题,Uniapp H5网页下载二进制pdf文件页面空白以及解决文件损坏打不开的情况,Uniapp app在线预览pdf文件流,PDF加载出来怎么办,服务器后端返回PDF文件流后前端进行下载但打开后一片白屏,解决pdf文件流,预览全是空白页,pdf文件流,下载

🏆 前端领域优质创作者 1万+

如何通过单步调试的方法,找到 SAP Gateway 到底把 Fiori 应用发送的 OData 请求,投递到哪一台 ABAP 后台服务器了?

这是一个 Count 请求,得到服务器响应的数据是 204,这个 204 会以数字的形式,显示在 Fiori Launchpad tile 上。那如果当前 Gateway 系统可以连接到多台 ABAP 后台服务器,比如下图所示,可以连接 SAP S/4HANA,ERP 或者 SAP CRM,我怎么知道 SAP UI5 应用上显示的数据,到底来自哪一台 ABAP 后台服务器呢?,就是上图 ABAP 调试器里断点停留的位置,即 SAP Frontend 服务器,通过 RFC 将 OData 请求投递给。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 640

iOS 关于UIWindow的一些知识--第一部分

近期被一个 UIWindow 的问题坑惨了 ????,网上查了很久,没什么资料,所以仔细再次深入研究了一下。 本文以问题的形式阐述,以下结论全部是看官方文档以及自己试验得出,如有错误,还望指出。 UIApplication ★ keyWindow The app's key window. This property holds the UIWindow object in the windows array that is most recently sent the makeKeyAndVis

box_kun的博客 1114

GPS系统跟踪捕获算法的Verilog实现在FPGA

本文将介绍GPS系统中的跟踪捕获算法,并提供该算法的Verilog实现在FPGA上运行的源代码。常用的方法是将接收到的信号与一个本地振荡器产生的参考信号进行混频,然后使用带通滤波器提取出希望得到的频率分量。码跟踪的目的是通过检测接收到的信号中的码片序列来实现对导航数据的解调。以上是一个简化的GPS系统跟踪捕获算法的Verilog实现,其中包含了时间检测、频率跟踪和码跟踪三个模块。GPS信号由载波频率和导航数据组成。跟踪捕获算法的目标是通过对接收到的信号进行处理,从而获取到准确的载波频率和导航数据。

PixelEnigma的博客 1108

Unity Android log view(Android Debug Bridge)

Android Debug Bridge

蛰伏--当你不够强大时,就不要放弃努力 4158

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

IOS-页面跳转与切换

IOS UINavigationController 的使用前言如何使用 UINavigationController 进行页面跳转结语 前言 对于稍微复杂一点的 UI,页面跳转都是无法避免的。 如何使用 UINavigationController 进行页面跳转 都说 UINavigationController 就是一个栈结构,页面跳转实际就是出栈和入栈的操作,确实如此。 下面是完整的使用过程: 首先,我们需要在 AppDelegate 定义一个 UINavigationController 对象:

weixin_43536737的博客 2321

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

iOS Status Bar 状态栏设置汇总

总结: 1) Status bar is initially hidden为NO时View controller-based status bar appearance不生效 2)View controller-based status bar appearance为NO时preferredStatusBarStyle和prefersStatusBarHidden方法不生效 3)UIViewController 在 UINavigationController 导航栏中时,在UIViewControlle

小桥流水哗啦啦,iOS Coder 哒哒哒 3814

iOS之StatusBar

  一. StatusBar的前景颜色设置 StatusBar字体默认为黑色, 要想在工程中启动和视图中的状态栏都是白色,用下面的方法简单配置下就行。1.设置Status Bar Style为Light. (Status bar style    UIStatusBarStyleLightContent)       2.在plist文件中添加 View controller-base...

Sooober的博客 920

ios状态栏操作

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES; //显示 [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; //隐藏让状态栏显示网络等待标志 状态栏是可以通过UIApplication类提供的一

承影 3万+

ios状态栏UIStatusBar

一,概述 状态栏(UIStatusBar)指iPhone/iPad/iPod屏幕顶部用于显示网络、时间和电量等的、高度为20点的控件。状态栏的windowLevel为UIWindowLevelStatusBar,而window的windowLevel为UIWindowLevelNormal。所以一般情况下,状态栏位于window之上。 状态栏分为两部分   如下图:前景部分为白色,背景

LXL_815520的博客 1728

iOS 横竖屏及状态栏的处理

做好配置后我们就可以对各个方向进行配置,因此需要监听屏幕的各个方向,我们可以用UIApplicationDidChangeStatusBarOrientationNotification来监听,代码如下。然后可以在 AppDelegate 通过一个参数控制支持的方向,最终都会以AppDelegate 中支持的方向为准。如果是有Navigation控制的,也需要在BaseNavigation里设置。这样的基础配置后,如果某个页面需要支持所有方向就可以重写对应的方法.这样我们就可以做强制横屏的竖屏的操作了。

lrbtony的博客 3108

iOS中关于UIWindow和statusbar的设置

最近在做开发时要做一个类似于UIAlertView的控件,做法是创建一个基于UIView的类,在里面进行自定义控件的设置,为了尽量模仿UIAlertView,在这个类里面创建了一个新的UIWindow并将self显示到这个window上。 由于app中statusbar中的内容为白色的,新创建的window就会改变statusbar的状态,不能得到我们想要的结果,为了避开一系列其他错误,设置

玖零後的专栏 1595

StatusBarNotificationCenter:iOS状态栏通知的优雅解决方案

StatusBarNotificationCenter:iOS状态栏通知的优雅解决方案 项目介绍 StatusBarNotificationCenter 是一个专为iOS应用设计的状态栏通知库,旨在为开发者提供一种简单、高效且高度可定制的状态栏通知解决方案。无论你是想要在应用中展示简单的提示信息,还是需要实现复杂的交互式通知,StatusBarNotificationCenter 都能满足你的需求...

gitblog_00176的博客 1055

iOS13 获取StatusBar并且获取网络状态

获取StatusBar 项目中通过StatusBar来获取手机当前状态,但是在iOS 13中便获取不到了,调试了一下发现是UIApplication无法获取到statusBar。 UIApplication *app = [UIApplication sharedApplication]; id _statusBar = [app valueForKeyPath:@"_statusBar"]; 于是改成如下的方式通过UIStatusBarManager获取statusBar。

u013712343的博客 2457

添加多个UIWindow时,使用keyWindow要注意一点

最近的项目里有个关于创建多个uiwindow时使用keywindow出现的bug。 有个任务是在打开信息展示时,要求不被任何东西遮挡。这里设计方案是添加一个新的HXUIWindow继承与UIWindow。测试时打开了HXUIWindow显示在屏幕上,执行打开 弹框 按钮(uiactionsheet或uialerview),当弹框消失后,再执行向主页最外层添加一个view,这个时候应该会想到用[[

HX_lei的博客 1万+

iOS 之 StatusBar 详解

转载自: https://juejin.im/entry/5827e35e8ac24700596a16fe 随便打开手机上的主流APP,我们不难发现它们的状态栏都是跟导航栏保持一致的背景颜色,如下图的微信和instagram: WECHAT.PNG INS.PNG 那么今天我们就来说一下StatusBar这个只有区区20像素高度的小东西。 UIStatusBarStyle 状态栏有两...

沸腾的泪水的专栏 1664
上一篇: Mac安装Redis4.0.8
下一篇: 使用clang查看OC源码C++实现报错的处理
lvmaker
博客等级 码龄17年 118粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值