- 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/
我注意到使用 swiftUI 的 withAnimation{} 的 XCode 有一个奇怪的行为。 我创建了以下工作示例: import SwiftUI class Block: Hashable,
我想要一个仅在有条件的情况下可见的动画 View 。当我这样做时,我会出现不可预测的行为。特别是,在以下情况下,我希望在 onAppear 中调用一个永远重复的动画,无论它在何时何地初始化,它总是可以
我有一个基于某些状态的 swiftUI 动画: withAnimation(.linear(duration: 0.1)) { self.someState = newState } 上述动画
我在研究 Swift UI 的线性动画技术时发现,与我的预期相反,增加持续时间似乎并没有使动画发生得更慢。这是故意的吗?如果是这样,我该如何制作较慢的动画? 示例代码: struct ButtonVi
我有一个包含多个部分的 UITableView,部分的数量是动态的,也就是说,它们可以随时增加。在 TableView 上重新加载带有动画的部分,其中部分的数量没什么大不了的。我只是这样称呼: [no
我的目标是在将对象添加到@State 事件数组时控制动画类型。 withAnimation 仅在第一次附加到事件数组时发生。然后在附加追加时忽略它。 我目前正在 Xcode 11 beta 4 上运行
我有一个带有可拖动组件(“弹性”文本)的屏幕,当释放时会弹回一个非常突出的 Spring 动画。 有些文本是异步传入的(在本例中,使用 Timer),我希望它能够很好地淡入,同时 Springy 标签
比方说,我有一个像这样的简单个人资料屏幕: class Model: ObservableObject { @Published var isSignedIn = false
我收到了这个警告: 'UIView' may not respond to 'addSubview:withAnimation:' 产生该警告的代码行是这样的: [self.masterView ad
这是我的代码(来自 Core Data 教程): [eventsArray insertObject:event atIndex:0]; NSIndexPath *indexPath = [NSInd
我正在构建一个动画进度按钮,它显示下载进度,然后在下载完成后展开以显示按钮文本(有点像 App Store 按钮)。 我有一个自定义按钮 View ,它采用 @Binding 到外部进度 CGFloa
我看到在 iOS 9 中,setStatusBarHidden(_:withAnimation:) 现在已被弃用,文档说使用 [UIViewController prefersStatusBarHid
我有一个隐藏了状态栏的应用程序。在主视图中,我使用 UIButtons 加载 subview View 。出于某种原因, subview 显示时带有隐藏的状态栏,但是,UI View 不会为此进行调整
我的 Root View Controller 中有代码观察 -[UIApplication sharedApplication] 的 @"statusBarHidden" 属性并调整其 View 的
我是一名优秀的程序员,十分优秀!