在导航栏中添加自定义视图,例如whatsapp

2024-02-04

我想创建自定义导航栏,就像 WhatsApp 用来在应用程序中显示呼叫指示器一样,​​如下所示。

我已成功添加如上所述的视图,但它没有响应,因为我无法检测到状态栏上的触摸。我只能触摸“触摸返回通话”下面的部分。

代码如下。

@property (nonatomic) UIView *navigationBarTopView;

UIWindow *window = [UIApplication sharedApplication].keyWindow;
if (_navigationBarTopView == nil) {
    _navigationBarTopView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, window.frame.size.width, 60.0)];
        [_navigationBarTopView setBackgroundColor:[UIColor colorWithRed:76.0/255.0 green:217.0/255.0 blue:100.0/255.0 alpha:1]];

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, _navigationBarTopView.frame.size.height - 15, window.frame.size.width, 10)];
    [label setText:@"Touch to return to call"];
    [label setTextColor:[UIColor whiteColor]];
    [label setFont:[UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]];
    [label setTextAlignment:NSTextAlignmentCenter];
    [_navigationBarTopView addSubview:label];

    //The setup code (in viewDidLoad in your view controller)
    UITapGestureRecognizer *singleFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    [_navigationBarTopView addGestureRecognizer:singleFingerTap];

    UITapGestureRecognizer *singleFingerTap1 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    [label addGestureRecognizer:singleFingerTap1];
}

[window addSubview:_navigationBarTopView];

我还尝试在状态栏上添加触摸,如下所示,但它不起作用。

如何检测 UIStatusBar/iPhone 上的触摸 https://stackoverflow.com/questions/2470562/how-do-i-detect-touches-on-uistatusbar-iphone

导航栏也没有下降。我尝试过设置keyWindow框架。但这也行不通。


UIStatusBar 的优先级高于应用程序的窗口,因此您不会通过状态栏获得任何触摸事件。

要通过状态栏获取触摸事件,您需要一个窗口级别高于 UIStatusBar 的窗口。

尝试下面的代码:

#import "AppDelegate.h"

@interface AppDelegate ()

@property (nonatomic) UIWindow *buttonWindow;
@property (nonatomic) UIWindow *textWindow;
@property (nonatomic) CGFloat callViewHeight;

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
        if (@available(iOS 11.0, *)) {
        if (([[[UIApplication sharedApplication] delegate] window].safeAreaInsets.top > 20.0)) {
            self.callViewHeight = 55.0f;
        } else {
            self.callViewHeight = 35.0f;
        }
    } else {
        self.callViewHeight = 35.0f;
    }
    return YES;
}

-(void)showVideoCallButton{
    self.textWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, self.callViewHeight)];
    self.textWindow.windowLevel = self.window.windowLevel + 1;
    self.textWindow.hidden = FALSE;

    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, self.callViewHeight)];
    view.backgroundColor = [UIColor colorWithRed:76.0/255.0 green:217.0/255.0 blue:100.0/255.0 alpha:1];
    view.clipsToBounds = TRUE;
    UILabel *lblName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, self.callViewHeight)];
    lblName.textAlignment = NSTextAlignmentCenter;
    [lblName setFont:[UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]];
    lblName.text = @"";

    UILabel *lblTouch = [[UILabel alloc] initWithFrame:CGRectMake(0, self.callViewHeight - 20.0f, [UIScreen mainScreen].bounds.size.width, 20.0f)];
    lblTouch.textAlignment = NSTextAlignmentCenter;
    [lblTouch setFont:[UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]];
    lblTouch.text = @"Touch to return to call";
    lblTouch.textColor = UIColor.whiteColor;

    [view addSubview:lblTouch];
    [view addSubview:lblName];

    [self.textWindow addSubview:view];

    self.buttonWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, self.callViewHeight)];
    self.buttonWindow.windowLevel = UIWindowLevelStatusBar + 1;
    self.buttonWindow.hidden = FALSE;

    UIButton *button = [[UIButton alloc] initWithFrame:lblName.bounds];
    [button setTitle:@"" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(buttonTouched) forControlEvents:UIControlEventTouchUpInside];
    [self.buttonWindow addSubview:button];

    self.textWindow.transform = CGAffineTransformMakeTranslation(0, -self.callViewHeight);
    self.buttonWindow.transform = CGAffineTransformMakeTranslation(0, -self.callViewHeight);

    [UIView animateWithDuration:0.25
                     animations:^{
                         self.textWindow.transform = CGAffineTransformIdentity;
                         self.buttonWindow.transform = CGAffineTransformIdentity;
                         if (@available(iOS 11.0, *)) {
                             if (([[[UIApplication sharedApplication] delegate] window].safeAreaInsets.top > 20.0)) {
                                 self.window.frame = CGRectMake(0, self.callViewHeight - 40.0f, self.window.bounds.size.width, self.window.bounds.size.height - self.callViewHeight + 40.0f);
                             } else {
                                 self.window.frame = CGRectMake(0, self.callViewHeight - 20.0f, self.window.bounds.size.width, self.window.bounds.size.height - self.callViewHeight + 20.0f);
                             }
                         } else {
                             self.window.frame = CGRectMake(0, self.callViewHeight - 20.0f, self.window.bounds.size.width, self.window.bounds.size.height - self.callViewHeight + 20.0f);
                         }
                     }];
}

-(void)hideVideoCallButton{

    [UIView animateWithDuration:0.25
                     animations:^{
                         self.textWindow.transform = CGAffineTransformMakeTranslation(0, -self.callViewHeight);
                         self.buttonWindow.transform = CGAffineTransformMakeTranslation(0, -self.callViewHeight);
                         self.window.frame = [UIScreen mainScreen].bounds;
                     } completion:^(BOOL finished) {

                         dispatch_async(dispatch_get_main_queue(), ^{
                             self.buttonWindow.hidden = TRUE;
                             self.buttonWindow = nil;

                             self.textWindow.hidden = TRUE;
                             self.textWindow = nil;
                         });

                     }];
}

-(void)buttonTouched{
    NSLog(@"Button Touched");
}

@end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在导航栏中添加自定义视图,例如whatsapp 的相关文章

  • 如何在 iOS 上删除配对的蓝牙设备?

    我希望我的应用程序可以删除配对的蓝牙设备 因为如果设备与 iPhone 配对 则该设备无法用于其他设备 我尝试了 CBCentralManager cancelPeripheralConnection 但它不起作用 他们仍然配对 或者还有其
  • iOS 应用程序和.NET 应用程序之间的通信?

    我有 2 个应用程序 一个是 iOS 应用程序 一个是 NET 应用程序 我希望我的 iOS 应用程序发送一条消息 调用 NET 应用程序的方法 将一些字符串发送到 NET 应用程序以保存到数据库 那么 我的 iOS 应用程序如何与 NET
  • 在 iPad 上的弹出窗口中推送导航视图控制器时动画弹出窗口内容大小

    当包含的 UINavigationController 推送新控制器时 如何让 UIPopoverController 为其大小设置动画 我有一个UIPopover正在显示从UIBarButtonItem在我的 iPad 应用程序中 它包含
  • UIWebView didFinishLoading 多次触发

    我有一些代码需要在 a 之后运行UIWebView完成加载文档 为此我设置了UIWebView的委托给我的控制器 并实现了webViewDidFinishLoading method 这会被多次调用 具体取决于要加载的页面类型 我不确定是否
  • 如何在 Xcode 4.5 中添加旧版本的 iOS SDK

    我在这里复制了 iOS 5 1 SDK 应用程序 Xcode app Contents Developer Platforms iPhoneOS platform Developer SDKs 但是 我仍然无法在 Xcode 中选择基础 S
  • ViewController.swift(界面)文件的用途是什么 - 在 Counterparts 中

    我刚刚注意到一个名为ViewController swift Interface 当我创建第一个 ViewController 时 Xcode 自动创建了它 Swift 中的类是否具有 需要与 Objective C 中相同的接口 并且由
  • ipatool 失败并出现异常:#

    将 Xcode 升级到 9 0 1 版本后 在我的项目之一中导出为 iPA 时 我遇到错误 ipatool 失败 出现异常 NoMethodError undefined method toolsPath for nil NilClass
  • 从 SwiftUI 视图转至 UIViewController

    我正在努力将一些 SwiftUI 内容实现到我现有的应用程序中 我目前有一个 UIViewController 它托管一个用于相机预览的 MTKView 我创建了一个新的 SwiftUI 视图 它现在是我的root视图 如我的设置Scene
  • 从 iPhone 上的 NSString 中删除 HTML 标签

    有几种不同的方法可以删除HTML tags从一个NSString in Cocoa One way http cocoa karelia com Foundation Categories NSString Flatten a string
  • FileManager 说文件不存在

    我有一个用例需要UIImage保存到文档目录 然后UIImage需要转换为PDF并保存到文档目录 转换为 PDF 的代码 var filePath NSString string self selectedMedia imagePath i
  • Swift 和 Objective-C 框架公开其内部结构

    我正在尝试将 Swift 添加到具有公共 私有和项目文件的现有 Objective C 框架中 为了让 Swift 能够访问项目文件 我添加了一个定义新模块的模块映射 例如MyFramework Internal 通过包含所有项目标题 如下
  • UICollectionView 项目顺序在从右到左语言中不颠倒

    我注意到一个大问题 在从右到左的语言中 单元格顺序没有正确颠倒 只有对齐是正确的 但仅适用于水平流布局 并且如果集合视图包含不同的细胞大小 是的 我知道这听起来很疯狂 如果所有单元格大小相同 则排序和对齐就很好 这是到目前为止我通过示例应用
  • 是否可以?相机 API ios [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想在应用程序中实现一项功能 当用户
  • 如何在文本末尾添加按钮,如 Facebook 的“继续阅读”?

    当状态帖子太长时 Facebook 应用程序会剪切文本并在末尾添加 继续阅读 它如何知道在哪里剪切文本并添加 继续阅读 不仅仅是向 textView 或标签添加按钮 而是如何剪切字符串 例如 在下图中 我将行数限制为 7 我可以在 text
  • 让约束在尺寸类别中发挥作用

    所以 我正在 Xcode 6 beta 中尝试尺寸类 我对图像设置了一些限制 使其根据 iPhone 纵向和横向对应的尺寸类别处于不同的位置 这些限制在下图中可见 正如您所看到的 当我处于紧凑 紧凑状态时 一些约束被 安装 而其他约束则没有
  • 连接到 Apple Music

    所以我尝试使用 React Native 应用程序从 iOS 设备连接到 Apple Music 有一个 API 可以执行相同的操作 但我需要从 storekit 框架调用一个函数 提出个性化请求 苹果音乐API https develop
  • iOS:addConstraints:应用程序崩溃

    Problem 我似乎无法在现有项目中采用自动布局 Details 我之前也遇到过与此问题相同的问题presentViewController 在 iOS 但所提供的答案都不是我的解决方案 我正在使用所有没有 xib 的故事板视图 我的 使
  • Apple Mach-O 链接器错误 armv7s 和 libGoogleAdMobAds.a

    我刚刚升级了我的应用程序以在新的 iPhone5 模拟器上运行 但是当我尝试为我的 iPhone 4S 设备构建它时 我收到此 Apple Mach O Liner 错误 ld 文件是通用的 3片 但不包含 n armv7s 切片 User
  • 即时将图像添加到 AR 资源以进行图像识别

    ARKit1 5介绍图像识别 在代码中 您必须创建一组参考图像 如下所示 let referenceImages ARReferenceImage referenceImages inGroupNamed AR Resources bund
  • UINavigationController 在后退按钮单击时向下滚动

    我正在开发一个带有多个导航控制器的 iPhone iPad 应用程序 当我在设备处于横向模式时单击视图的后退按钮时 前一个视图会垂直滚动到屏幕中 而不是像往常一样水平滚动 推送动画始终水平工作 正如它应该的那样 是什么导致了这个奇怪的问题

随机推荐

  • JSON 编码/解码 GTK 枚举

    我必须将自定义 GTK 元素的各种属性保存到文件中以供将来使用 并由于简单的格式和字典嵌套而决定使用 JSON 许多属性都是 GTK 枚举 例如gtk PAGE ORIENTATION PORTRAIT gtk ANCHOR CENTER
  • C 中的整数溢出:标准和编译器

    感谢 Carl Norum 的编辑 以包含正确的标准参考 C 标准规定 If an 特殊情况发生在表达式求值期间 即 如果结果未在数学上定义或不在其类型的可表示值范围内 则行为未定义 是否有编译器开关可以保证整数溢出时的某些行为 我想避免鼻
  • 如何取消定义或删除 JavaScript 函数?

    我定义了一个全局 Javascript 函数 function resizeDashBoardGridTable gridID var table document getElementById treegrid gridID 在使用这个函
  • 是否有一种标准方法来为 Java EE 容器定义 JDBC 数据源?

    我知道对于 JBoss 您需要在相应实例的 deploy 子目录中有一个 name ds xml 文件 我没有任何使用其他 Java EE 容器的经验 但我试图尽可能遵守标准 是否有定义 JDBC 数据源并部署它的标准方法 如果可能的话 我
  • 外部内联函数会发生什么?

    如果我在 h 文件中将函数定义为 extern int returnaint void 在相关的 c 文件中将其定义为 inline int returnaint void return 1 并将标头包含在另一个 c 文件中并使用该函数 当
  • 适用于 html5 和 jquery 应用程序的条码扫描器

    我正在一个项目中使用 Jquery 和 html 它是一个静态 Web 应用程序 我需要一个 jquery 来读取产品中条形码扫描仪的条形码 需要扫描条形码而不在屏幕的任何文本框中显示代码 有人请给我一些想法或为我提供插件的链接 如果有 来
  • PHP 中 C# 的“List ”等价物是什么?

    我正在使用一个 API 它要求我提供一个List
  • EF Code First:使用 Fluent API 映射非表对象

    我应该如何使用 Fluent API 映射 EF Code First 中的重要对象 例如视图 StoredProcedure 等 代码优先中尚不支持映射到存储过程和 vew 这些是 Julia Lerman 的编程实体框架 代码优先的一些
  • 带有两个 ArrayList 的 Android ListView 适配器

    In our chat app we want to use cool new Library SQLBrite https github com square sqlbrite to update chat on database cha
  • 未找到特征“Illuminate\Foundation\Auth\Access\AuthorizesResources”

    有人熟悉我遇到的这个错误吗 请帮忙谢谢 如果您使用 Laravel 5 3 请执行以下操作 来自升级指南 AuthorizesResources Trait AuthorizesResources 特征已与 AuthorizesReques
  • VS 2012 / 2013 AccessViolationException

    当我运行项目 F5 时 我在 IDE 中收到以下异常 An unhandled exception of type System AccessViolationException occurred in System Windows For
  • 仅包含单个 mp4 文件的 MPEG-DASH 视频流

    我研究了一周 寻找一种简单且独立于平台的方法 将 mp4 文件传输到任何浏览器 如果浏览器不兼容 将使用渐进式流 直接下载 方法 我的场景是这样的 单个 mp4 文件 未分段和复用 音频 视频 支持 HTTP 字节范围服务 在浏览器不兼容的
  • Android studio 重命名包后抛出 Nomatching client found

    我按照下面的链接重命名了包 重命名后 当我尝试构建项目时 android studio 会抛出类似的错误 Android Studio重命名包 https stackoverflow com questions 16804093 andro
  • 多个if条件excel,矩阵结构

    Box type Box type Box type Box type BinLoc 810 811 911 822 S1 2 0 1 0 S2 4 2 2 1 S3 12 6 6 3 S4 24 12 12 6 R1 48 24 24 1
  • Akka 消息传递保证

    我正在尝试找出 Akka 支持哪些消息传递保证 我得出以下结论 最多一次 默认支持 至少一次 由 Akka Persistence 支持 恰好一次 Akka支持exactly once吗 如果不这样做 我怎样才能实现这一目标 正如您所发现的
  • 提高处理具有 1 亿个元素的 ArrayList 时的速度和内存消耗

    我使用其中包含短字符串 10 位数字 的文本文件 文件大小约为1 5Gb 因此行数达到1亿行 每天我都会收到另一个文件 需要提取新元素 每天数万个 解决我的问题的最佳方法是什么 我尝试在 ArrayList 中加载数据 每个文件大约需要 2
  • Flutter:如何监听 FirebaseUser 是否已通过电子邮件验证布尔值?

    My Idea 我想在 Flutter 中使用 Firebase Auth 插件来注册用户 但在他们可以访问该应用程序之前 他们必须验证自己的电子邮件地址 因此 我在注册后将 Firebase 用户推送到验证屏幕 这只是一个加载屏幕 告诉用
  • PHPUnit的白名单和黑名单似乎被忽略

    我正在一个项目上设置 PHPUnit 该项目的结构如下 build src service PHP source code files here tests php unit PHP unit tests here bootstrap ph
  • 文本对齐中心 - shell 脚本

    我正在使用 shell 脚本创建一个基于控制台的简单脚本 它将在我的 bash shell 上运行 它是一个简单的基于菜单的驱动显示一些选项集 现在我想根据屏幕尺寸将文本居中对齐 如何将文本对齐到屏幕中央 请帮助我 最后我找到了解决方案 C
  • 在导航栏中添加自定义视图,例如whatsapp

    我想创建自定义导航栏 就像 WhatsApp 用来在应用程序中显示呼叫指示器一样 如下所示 我已成功添加如上所述的视图 但它没有响应 因为我无法检测到状态栏上的触摸 我只能触摸 触摸返回通话 下面的部分 代码如下 property nona