使用自定义模式呈现处理通话状态栏

2024-01-08

问题

我在演示时注意到一些奇怪的行为UINavigationController(使用根视图控制器,自然已经推送)UIViewControllerAnimatedTransitioning打电话期间。

  • 如果通话状态栏已启用after当导航控制器出现时,导航控制器会按预期向下移动其视图。但当通话结束时,控制器不会将其视图向后移动,从而在状态栏下方留下 20p 的间隙。
  • 如果通话状态栏已启用before呈现控制器时,控制器根本不考虑状态栏,使 44p 高的导航栏的 4p 从 40p 状态栏下方窥视。当通话结束时,控制器会将其视图向下移动以适应正常的 20p 状态栏。

*注意:这是在模拟器上进行测试的,因为启用/禁用通话状态栏很容易,但测试人员在实际手机上观察到了这种现象。

我的(部分)解决方法

如果状态栏高度异常,我通过在演示期间调整控制器的框架来解决这个问题:

@interface CustomAnimationController : NSObject <UIViewControllerAnimatedTransitioning>
@end

@implementation CustomAnimationController

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
    UIViewController *toController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView *container = [transitionContext containerView];

    CGRect frame = [transitionContext finalFrameForViewController:toController];
    if (CGRectEqualToRect(frame, CGRectZero))
    {
        // In my experience, the final frame is always a zero rect, so this is always hit
        UIEdgeInsets insets = UIEdgeInsetsZero;
        // My "solution" was to inset the container frame by the difference between the 
        // actual status bar height and the normal status bar height
        insets.top = CGRectGetHeight([UIApplication sharedApplication].statusBarFrame) - 20;
        frame = UIEdgeInsetsInsetRect(container.bounds, insets);
    }

    toController.view.frame = frame;
    [container addSubview:toController.view];

    // Perform whiz-bang animation here
}    

@end

此解决方案确保导航栏位于状态栏下方,但当通话结束时导航控制器仍然无法将其自身移回原来位置。所以应用程序至少是可用的,但是通话结束后导航栏上方有一个难看的 20p 间隙。

有没有更好的办法?

我是否缺少一些关键步骤来确保导航控制器自行处理通话状态栏?当使用内置的模式呈现风格呈现时,它工作得很好。

在我看来,这有点像 UIKit bug——毕竟,导航控制器似乎接收到了UIApplicationWillChangeStatusBarFrameNotification(参见问题的第二点)。如果其他人遇到过这个问题并且找到了更好的方法,我将不胜感激。


我花了太多时间来解决状态栏高度问题,并提出了一个适合我的通用解决方案,我认为也适合您的情况。

首先,状态栏有一些奇怪的地方。

  1. 通常高度为 20 点,屏幕通常为 56高8分

  2. “通话中”时,状态栏高 40 点,屏幕 54高8分

  3. 状态栏隐藏时,状态栏高0点,屏幕5点6高8分

如果状态栏发生变化但您不更新屏幕的高度,那么计算将关闭,这可以在一些相当大的名称(甚至默认)应用程序中看到。

因此,我提出的解决方案有两个: 1. 创建一个宏来获取调整后的屏幕高度 2. 注册通知以在状态栏更改时更新视图。

这是宏,我建议将它们放入您的prefix file

#define kScreenWidth     [UIScreen mainScreen].bounds.size.width
#define kStatusBarHeight (([[UIApplication sharedApplication] statusBarFrame].size.height == 20.0f) ? 20.0f : (([[UIApplication sharedApplication] statusBarFrame].size.height == 40.0f) ? 20.0f : 0.0f))
#define kScreenHeight    (([[UIApplication sharedApplication] statusBarFrame].size.height > 20.0f) ? [UIScreen mainScreen].bounds.size.height - 20.0f : [UIScreen mainScreen].bounds.size.height)

此外,我发现以下通知中心调用在状态栏发生变化时 100% 都适用。

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self.view selector:@selector(layoutSubviews) name:UIApplicationWillChangeStatusBarFrameNotification object:nil];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用自定义模式呈现处理通话状态栏 的相关文章

  • iOS 11 浏览器图像错误

    在 iOS 11 中滚动页面时出现以下错误 在 Firefox Safari 和 Chrome 中 在 Android 设备中 不会发生该错误 这些是背景图像 我不知道这是否是导致错误的原因 图 2 显示了图像在 Android 中的用途和
  • UITableView 由于阴影和边框而滞后

    我有以下代码来向 UITableViewCell 的背景添加边框颜色和阴影 我的问题是这段代码会导致 tableView 本身出现巨大的滞后 请你告诉我如何优化我的代码 防止 UITableView 的滞后 if cell viewWith
  • 当聚焦非 UILabel titleView 时,VoiceOver 会读取辅助功能标签两次

    我在使用 VoiceOver 时遇到了一个奇怪的问题 Goals Set a UIStackView含有多个UILabel就如我的navigationItem titleView 将堆栈视图标记为辅助功能元素并设置其accessibilit
  • 在 iPad 上显示 PDF 文档 - 颜色问题

    我为 iPad 构建了一个 PDF 阅读器 在将预览中的文档与模拟器和设备进行并排比较时 我注意到一些颜色问题 最好的形容就是颜色变得更加浓郁 近距离使用的相似颜色之间的任何差异都会变得更加明显 而所有颜色总体上看起来都更亮 尽管大肆宣传将
  • UITextField 的自定义字体在编辑模式下发生变化

    我有一个UITextField这是从 xib 加载的 在它的视图控制器中viewDidLoad方法中 我将字体设置为自定义值 该值在 plist file和所有 它显示良好 除非处于编辑模式 此时字体从我的自定义字体切换为默认字体 我认为这
  • 自定义 UITableViewCell 和 setSelected:animated 上的动画:

    我有一个UITableViewCell在drawRect 方法中进行绘制的子类 整个矩形是自定义绘制的 包括背景 我能够获得非常复杂的单元格 同时保持滚动非常平滑 我的问题 我打电话 table deselectRowAtIndexPath
  • 如何在 iOS 上捕获的视频中添加水印[重复]

    这个问题在这里已经有答案了 我想知道是否有人可以告诉我如何实现这一目标 如果一直在考虑几个解决方案 从捕获的视频创建单独的图像 然后将它们合并到每个图像中 然后创建一个新的 AVAsset 听起来有点复杂 您不觉得吗 合并2个视频 一个是透
  • 在覆盖 UIView 的右下角创建四分之一透明孔

    您好 我想在覆盖 UIView 的右下角创建一个四分之一透明孔 我可以使用下面的代码解决它 但它看起来不正确 因为我在视图之外创建了一个矩形 我尝试过的 implementation PartialTransparentView id in
  • 如何在谷歌地图中绘制多个点之间的路线?

    我已经在我的应用程序中实现了谷歌地图 并且我需要在地图上标记几个点 我能够用标记标记它们 但我面临的问题是尝试绘制所有这些点之间的路径 我尝试使用折线 但它只是在 A 点和 B 点之间绘制一条直线 我还尝试了谷歌地图 DirectionsA
  • CloudKit 和 Core 在设备之间同步数据

    我创建了一个简单的Notes应用程序基于Core data 现在我想在用户设备之间添加同步 以及我读过的所有文章 this https www raywenderlich com 134694 cloudkit tutorial getti
  • 当前图像选择模式会擦除 UI

    我下面有一个非常简单的视图控制器 UI 实际上只是一个带有底部标签栏的按钮 import UIKit class ImageAdderViewController UIViewController override func viewDid
  • 我可以在 Swift 3 项目中使用 Swift 2.3 框架吗?

    在我的项目中 我将所有私有 swift 2 3 文件迁移到 swift 3 我想使用用 swift 2 3 编写的遗留框架 直到它们有 swift 3 版本 我尝试添加 使用旧版 Swift 版本 是 清除 构建我的项目 但我仍然遇到一些麻
  • 将 UIPanGestureRecognizer 添加到 UIScrollView 时禁用滚动

    我有一个滚动视图 我想让它在平移完成时消失 它工作正常 平移时滚动视图消失 但问题是现在我无法滚动内容 UIView animateWithDuration 0 2 delay 0 2 options UIViewAnimationCurv
  • 未安装 Apple 的全球开发者关系 (WWDR) 中间证书

    我今天无法通过 Appcelerator Titanium 发布我的应用程序 AdHoc 我开始收到此错误 错误 未安装 Apple 的全球开发者关系 WWDR 中间证书 错误 这将阻止您为 iOS 设备构建应用程序或用于分发的软件包 我上
  • 使用 Swift 在 Sprite Kit 中构建棋盘游戏? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在使用 Swift 的 Sprite Kit 中 我试图构建一个国际象棋棋盘 实际上是一个类似国际象棋的棋盘 平铺网格 那么一般来说
  • 在 iOS 上,边距、边缘插入、内容插入、对齐矩形、布局边距、锚点...之间有什么区别?

    iOS 社区中似乎有几种不同的选项 术语 人们在布局方面使用 例如 UIEdgeInsets 是一种类型 但有时我听到 读到 设置插图 或布局边距与布局指南 我总是能够找到有效的选择 但我永远不确定我是否使用了正确的工具来完成这项工作 有人
  • 如何在UiView中添加UIImagePickerController

    如何在TabBarApplication中的UiView中添加UIImagePickerController 无论您是否在选项卡中 此代码都会进入您视图的 ViewController 类 当您需要时创建一个选择器 UIImagePicke
  • 使用自动布局时 UIScrollview 的中心内容

    我在项目中使用自动布局 并且有一个滚动视图 其中有一个居中的按钮 我已经让滚动视图滚动 但不占据整个屏幕 我尝试按照此处的教程进行操作 https developer apple com library ios technotes tn21
  • iOS-将图像转为视频时,CVPixelBufferCreate内存无法正确释放

    我正在将图像制作成视频 但总是因为内存警告而崩溃 分配太多CVPixelBufferCreate 我不知道如何正确处理 我看过很多类似的主题 但没有一个能解决我的问题 这是我的代码 void writeImagesArray NSArray
  • 有没有办法从 Instruments (Xcode) 的命令行实例中删除授权提示?

    我目前正在通过 bash 脚本使用 Instruments 来启动命令行界面以启动自动化插件的运行 在 4 2 中 这工作得很好 但是随着升级到 Xcode 4 3 我现在被提示需要授权用户 分析其他进程 即使授予了正确的凭据 也不会真正对

随机推荐

  • 按行数设置 TableView 高度

    我有TableView in the MainstoryBoard并且行数每次都是随机的 我想要整体的高度TableView灵活 我的意思是 例如 如果我有 4 行TableView和每个TableView行高是 22 所以TableVie
  • 为什么 JSON.parse 会抛出跨域错误?

    如果没有 JSON parse 以下代码可以正常工作 如果我尝试解析或字符串化我的数据对象 我会收到跨源错误 为什么会发生这种情况以及如何解决它 我在 Title js 中有以下代码 const name show title JSON p
  • EF 6 参数嗅探

    我有一个动态查询太大 无法放在这里 可以肯定地说 在其当前形式中 它利用 CLR 过程根据传递的搜索参数数量动态构建联接 然后获取该结果并将其联接到更详细的表中 以带回对最终用户重要的属性 我已将整个查询转换为 LINQ to Entiti
  • Java - 创建内部时钟

    我希望计算从Java中的特定时间开始经过的时间 以毫秒为单位 经典的使用方式System currentTimeMillis 作为开始时间 然后再次将其与前一个时间一起使用来获取经过的时间 我希望做类似的事情 但不依赖系统时间 如果我依赖系
  • 如何测试 Aural 样式表/CSS3 语音?

    我正在窥探网站代码并注意到他们使用 media aural 这让我想起了它的存在 所以 我想我会玩玩 但后来意识到我不知道如何测试它们 我不希望我的网站听起来像施瓦辛格一家在吃圣诞晚餐 如何通过浏览器测试听觉或语音以确保听起来没问题 听觉和
  • 为什么我们需要 ASP .NET 5 wwwroot 中的 web.config?

    在 ASP NET 5 中 配置 http aspnetmvc readthedocs org projects mvc en latest migration migratingconfig html正在发生巨大的变化 我们不再有web
  • 如何将表格放入帮助模式?

    我正在尝试将 Delphi 2010 中的表单置于 帮助模式 中 我有一个用户单击的按钮 我希望光标更改为帮助光标 然后当用户单击控件时 显示控件的帮助 我可以发送窗口消息吗 Send a WM SYSCOMMAND http msdn m
  • 更新到 Android Studio 3.5 版本后出现的新问题。运行应用程序时不会出现 ADB 设备选择屏幕 (SHIFT-F10) [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 新问题 在 Android Studio 3 5 上运行应用程序时 不再出现设备选择屏幕 它默认为 随机 设备 尝试在谷歌上寻找答案 不去
  • BadZipFile:通过导入 keras 文件不是 zip

    当我运行这段代码时 我得到以下结果error https i stack imgur com YJbTE png 我尝试过不同的技术来解决这个问题 但没有成功 我可以请求有人可以帮助我解决这个问题吗 对于同一问题有一些解决方案 但我无法得到
  • 什么是 pycryptodomex?它与 pycryptodome 有什么不同?

    今天我看到 PySNMP 安装 pycryptodomex 这x这个名字看起来既可疑又令人惊讶 我试图追踪它 但看起来两者都是密码球 https pypi org project pycryptodome and pycryptodox h
  • 为什么Intellij IDEA说已使用的属性未使用?

    我的 Java Maven 项目中有一个属性文件 我有一个类加载这些属性并将它们存储为常量 Constants java file has this code Properties properties new Properties bla
  • 测试假存储库有什么意义?

    当我在家开发时 我一直在努力让自己的心态更加面向 TDD 和一点 DDD 我不明白的一件事是为什么你要创建一个假存储库来测试 我还没有真正研究过它 但测试的想法肯定是帮助解耦你的代码 给你更多的灵活性 减少所需的代码并减少错误的数量 那么有
  • 从数据库中选择、分组和求和结果

    我有一个数据库 其中有一些我想求和的字段 但这不是大问题 我想按这些字段的创建月份对它们进行分组 ActiveRecord 自动创建一个名为 created at 的字段 所以我的问题是 如何按月对结果进行分组 然后对每个月的字段求和 更新
  • Android 应用程序中的布局充气器是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 Android 中的 Layout Inflater 是做什么的 https stackoverflow com questions 3477422 what does layout inflater
  • 检查文件扩展名是否为图像的好方法

    我有这个文件类型过滤器 public const string Png PNG Portable Network Graphics png png public const string Jpg JPEG File Interchange
  • 为什么是“特质T”? C级; class X extends (C with T)` 无法编译?

    斯卡拉代码 trait T class C type W C with T class X extends W W是一个类型别名 但我想定义一个类来扩展它 为什么以及如何解决它 我很难以一种很好的方式构建我的答案 但这里仍然试图解释正在发生
  • Perseo fe docker 实例无法启动

    我面临以下问题 我正在尝试将 FIWARE Perseo 作为 docker 实例部署到我的 Centos 7 服务器 尽管 perseocore 实例运行没有问题 但 perseo 前端的情况却不同 它已创建但无法启动 从日志中可以清楚地
  • PHP 致命错误:调用布尔值上的成员函数 format()

    崩溃于 PHP 致命错误 调用布尔值上的成员函数 format 但对于其他日期效果很好 格式错误 这两个示例都不起作用 因为您有多个错误 您忘记了第二个参数Datet
  • 跳出范围解决方案以及不同指令如何影响范围

    我一直在与错误 jmp out of range 作斗争 很多时候我需要从代码的不同部分运行子程序 就像在 C 中运行函数一样 我发现代码的两端都需要跳转到同一个地方 但两者却无法到达那里 解决这个问题的办法是什么 我还注意到 PRINT
  • 使用自定义模式呈现处理通话状态栏

    问题 我在演示时注意到一些奇怪的行为UINavigationController 使用根视图控制器 自然已经推送 UIViewControllerAnimatedTransitioning打电话期间 如果通话状态栏已启用after当导航控制