在 `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 显示