- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的 Root View Controller 中有代码观察 -[UIApplication sharedApplication]
的 @"statusBarHidden"
属性并调整其 View 的大小作为响应。
当我这样做时,会触发 KVO 通知:
[[UIApplication sharedApplication] setStatusBarHidden:YES]
但是当我这样做时,不会触发 KVO 通知:
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide]
当状态栏重新出现时,我需要调整 View 大小,但我使用的是调用后一种方法的第三方 API。
处理此问题的最佳方法是什么?
最佳答案
就为什么您在通知触发中看到这种差异而言,这可能与 KVO 的工作方式有关。您观察属性 的值。在本例中,statusBarHidden
。但是,为了获得通知,该属性必须通过为其存在的 setter 进行更改。
通知不可能神奇地发生,因此实际上需要将其编码为 setter 的副作用。 (这通常是在编写您的属性时自动为您完成的)但是,具有该属性的类也可以选择直接修改 ivar。在这种情况下,UIApplication
有一个内部结构 _applicationFlags
,其中包含
unsigned int statusBarHidden:1;
因此,setStatusBarHidden:withAnimation:
完全有可能只是直接修改底层数据成员,这绕过了回调观察者所需的 setter。
就您的解决方法而言,您没有提及此应用是否适用于应用商店(可能是出于个人/爱好目的,可能是企业应用,也可能是越狱应用)。
可能您可以选择的一件事是使用 method swizzling将 setStatusBarHidden:withAnimation:
的默认实现替换为您自己的实现。您自己的实现可以简单地调用 setStatusBarHidden:
,然后它会重新启用 KVO。或者,如果您想保留动画,您可以使用 GCD 安排 setStatusBarHidden:
在 setStatusBarHidden:withAnimation:
完成动画所需的时间后运行。这样,您仍然可以获得动画,并且还可以通过调用 setStatusBarHidden:
触发 KVO。
我不清楚 App Store 应用程序是否总是拒绝方法调配。我认为它是(至少,在 iOS 框架中调配方法时),但是 according to this, it is either allowed, or can slip through .
下一个问题是,“如果方法调配确实是 Apple 希望您避免的事情,尽管它是 being in public APIs,有没有办法解决这个问题?”
除非人在the Stack Overflow question I linked to在撒谎,看起来它确实通过了审查(至少有时)。所以,也许它没有以自动化的方式进行测试。也许它有时会被人类测试人员视觉识别,他们看到标准功能以不同的方式工作,他们推断一定是方法调配的结果。在这种情况下,您实际上并不想使用它来更改状态栏 UI 行为,只是为了锁定通知,所以这不应该打扰他们。
或者,他们可能正在搜索已知 iOS API(与调配一起使用)的选择器。如果是这样的话,从字符串构建的选择器很容易被混淆,to avoid detection .
无论如何,只有一些选择......
关于ios - -[UIApplication setStatusBarHidden :withAnimation] does not fire KVO notifications for @"statusBarHidden" key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13730984/
我有一个 UIView,我想将其添加到 keyWindow 中,以便它覆盖所有内容(包括 StatusBar)。当我添加 View 时,我使用以下代码删除了状态栏: [[UIApplication s
如果我使用这种方法,是否可以通过某种方式将屏幕设置为完整的 320x480 而不是隐藏状态栏之前的 320x460? 非常感谢,-代码 最佳答案 将这段代码写在AppDelegate.m文件中 [[U
在我的 UIViewController 中,我有: - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animate
我已经尝试了所有我能找到的解决方案,包括:setStatusBarHidden is deprecated in iOS 9.0但它们都不适用于我的应用程序。 这是一个简单的单 View 应用程序。有
今天我的应用程序获得了批准,但我收到用户发来的电子邮件说它崩溃了。我发现了 [[UIApplication sharedApplication] setStatusBarHidden:YES with
我发现设置后 [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO] 在 viewDidLoad 处,如果我想将图
我在 StackOverflow 上找到了有关该问题的信息,但无法解决我的问题。 Calling the appropriate setStatusBarHidden per iOS version
当 setStatusBarHidden:NO 设置为 View 加载时,UINavigationBar 和其他元素立即对齐在 StatusBar 下方。但是,当 setStatusBarHidden
我看到在 iOS 9 中,setStatusBarHidden(_:withAnimation:) 现在已被弃用,文档说使用 [UIViewController prefersStatusBarHid
所以我的应用程序在 AppDelegate 中将状态栏设置为隐藏,就像这样。它按预期工作。 [[UIApplication sharedApplication] setStatusBarHidden:
我有一个隐藏了状态栏的应用程序。在主视图中,我使用 UIButtons 加载 subview View 。出于某种原因, subview 显示时带有隐藏的状态栏,但是,UI View 不会为此进行调整
我正在将我的代码从 iOS 8 升级到 iOS 9。我的程序中有一个代码片段[[UIApplication applicationName] setStatusBarHidden:YES];. 我收到
我是 iOS 开发新手。我只想在启动相机时隐藏状态栏,这样相机控件就不会与状态栏重叠。我找到了添加此行的解决方案: [[UIApplication sharedApplication] setStat
我想在我的 iOS v5 通用应用程序中切换状态栏。 但发现其他人似乎有 UIViews(在我的例子中是添加到主视图的 subview )如果您随后旋转设备(我正在使用模拟器),只会回收隐藏状态栏留下
我的 Root View Controller 中有代码观察 -[UIApplication sharedApplication] 的 @"statusBarHidden" 属性并调整其 View 的
我是一名优秀的程序员,十分优秀!