多个 UIViewControllers 同时

Posted

技术标签:

【中文标题】多个 UIViewControllers 同时【英文标题】:Multiple UIViewControllers simultaneously 【发布时间】:2011-02-17 23:45:31 【问题描述】:

我想在导航控制器中有一个 UITableView 占据整个屏幕。我有一个较小的自定义 UIView 需要从底部向上滑动,将表格视图挤压 100 像素。自定义视图需要是静态的,而不是在用户导航 tableview 时移动。我被告知不要让 2 个 UIViewControllers (VC) 在同一屏幕上管理视图。

目前,我的 AppDelegate 从 VC 向其窗口添加了一个子视图,然后使用

加载 tableview 和自定义视图

[self addSubview:tablviewcontroller.view]; [self addSubview:customViewController.view];

这应该如何实现?

【问题讨论】:

【参考方案1】:

我的结构如下: 有一个 UIViewController 子类,它的视图占据了整个屏幕。它将有两个子视图。 第一个子视图:包含您的表视图控制器的 UINavigationController 的视图。 第二个子视图:自定义 UIView。

将 UINavigationController 的框架初始设置为主视图控制器视图的整个边界以及屏幕可见区域下方的自定义视图框架。

当您需要向上滑动视图时,使用 UIView 动画通过降低高度来更改 UINavigationController 视图的框架,并通过将其 y 坐标更改为现在在框架内来更改自定义 UIView 的框架。

【讨论】:

【参考方案2】:

好的。你需要一个导航控制器,它的根视图是一个表格视图。然后,可能通过用户输入,您希望此表格视图向上滑动 100 像素,并在底部出现另一个视图。当其他视图保留在那里时,用户可以继续使用表格视图。

我会这样做:

创建一个通用视图控制器(我们称之为NavigationWithAuxiliaryViewController)。这个类的根视图覆盖了你所有的应用程序窗口。

这个视图有一个UINavigationController的实例作为它的属性,比如navController。它还有一个 UIView(用于其他视图)作为其属性(例如,auxView)。将另一个视图放在底部。但是,默认情况下此视图是隐藏的。另外,UINavigationController 的根视图的框架覆盖了整个视图。

当你决定压缩表格视图时,修改 UINavigationController 的frame 属性。做这样的事情(虽然不是这么丑):

if (slideViewOn) 
    [UIView beginAnimations:@"slideUp" context:nil];
    navController.view.frame = CGRectMake(0, 0, 320, 260);
    auxView.hidden = NO;
    [UIView commitAnimations];
 else 
    [UIView beginAnimations:@"slideDown" context:nil];
    navController.view.frame = CGRectMake(0, 0, 320, 480);
    auxView.hidden = YES;
    [UIView commitAnimations];

压缩整个导航/表格内容的最简单方法是修改导航控制器的整个框架,这就是为什么您需要一个单独的视图(在导航控制器之外)用于另一个视图。

【讨论】:

以上是关于多个 UIViewControllers 同时的主要内容,如果未能解决你的问题,请参考以下文章

内存泄漏,多个 UIViewControllers 的其他问题

如何向多个 UIViewControllers 添加点击手势

跨多个UIViewControllers的统一UICollectionView

如何让 viewForZoomingInScrollView 在 Xcode 中跨多个 UIViewControllers 工作?

UIViewControllers 中的 UIViewController

UIViewControllers 问题