在 `UIViewController` 上方添加 `UIView`

Posted

技术标签:

【中文标题】在 `UIViewController` 上方添加 `UIView`【英文标题】:Add `UIView` above `UIViewController` 【发布时间】:2018-04-02 13:15:45 【问题描述】:

在我的应用中,我想做一些类似于 Spotify 在他们的应用中所做的事情。

他们在应用中的所有其他视图上方添加了UIView(红色条)。我尝试通过将以下代码添加到我的RootSplitViewController 来做到这一点,但这不起作用。

- (void)viewWillAppear:(BOOL)animated 
    [self.view addSubview:[[BannerView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44.0f)]];
    for (int i = 0; i < [self.viewControllers count]; i++) 
        UIViewController *vc = [self.viewControllers objectAtIndex:i];
        vc.view.frame = CGRectMake(vc.view.frame.origin.x, 44, vc.view.frame.size.width, vc.view.frame.size.height-44);
    

这只是在我的UINavigationBar 上添加了一个红色视图,而不是“将其向下推”。关于如何解决这个问题的任何想法?

【问题讨论】:

你是指图片中的红色视图吗?什么不起作用?它是否出现在错误的地方,或者根本没有,或者......?请在您的问题中更具体。 View on Top of UITabBar的可能重复 真的不是。这家伙想在他的UITabBar 上显示一个视图,我想显示一个将“应用程序”向下推的栏。 然后在你的问题中澄清这一点。您之前没有提到您想要“一个将应用程序向下推的栏”。并请解释哪个部分不起作用。这将帮助您获得更有用的答案。 @user4992124,你成功了吗?我想做完全相同的事情,使用标签栏控制器,在所有可能的屏幕上按下 20 点。谢谢 【参考方案1】:

您可以将视图添加为UIApplication.shared.keyWindow 中的子视图

例如你的情况:

在 Swift 4 中

let window = UIApplication.shared.keyWindow!

let fullScreenView = UIView(frame: CGRect(x: window.frame.origin.x, y: window.frame.origin.y, width: window.frame.width, height: window.frame.height))

let yourRedView = UIView(frame: CGRect(x: 0, y: 0, width: fullScreenView.frame.width, height: 100))

fullScreenView.backgroundColor = UIColor.gray        
yourRedView.backgroundColor = UIColor.red

fullScreenView.addSubview(yourRedView)

window.addSubview(fullScreenView)

在 Objective-C 中

UIWindow* window = [UIApplication sharedApplication].keyWindow;

UIView* fullScreenView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, window.frame.size.width, window.frame.size.height)];

UIView* yourRedView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, window.frame.size.width, 100)];

[yourRedView setBackgroundColor:[UIColor redColor]];
[fullScreenView setBackgroundColor:[UIColor grayColor]];

[fullScreenView addSubview:yourRedView];
[window addSubview:fullScreenView];

【讨论】:

你能把它也添加到 ObjC 中吗? 是的,当然@user4992124【参考方案2】:

我会创建一个位于层次结构根部的 containerViewController。这有两个子视图控制器:您当前的 rootVC 和持有红色视图的 VC。现在每次显示红色视图时,您的 containerVC 都可以更改子视图控制器的边界并将它们都显示在屏幕上,即使带有一些动画。

另请参阅此处的 Apple 文档:https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html

【讨论】:

谢谢!这确实是我采用的解决方案。【参考方案3】:

您可以在窗口级别添加视图。

let appDelegate = UIApplication.shared.delegate as! AppDelegate
    if let win = appDelegate.window 
        win.addSubview(<#Your View#>)
    

这将在UIWindow 添加一个视图作为子视图。

目标 C

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
[[appDelegate window] addSubView:<#Your View#>];

【讨论】:

以上是关于在 `UIViewController` 上方添加 `UIView`的主要内容,如果未能解决你的问题,请参考以下文章

UIViewController 根视图中的 UITableView 显示

TableViewController 中各部分上方的 Xcode 文本字段

首先添加一个 UIView,甚至是导航栏

旋转后表格视图中第一部分上方的透明空间

当文本字段获得焦点时,如何使底部工具栏浮在软键盘上方

presentViewController 和 UIViewController 布局