Iphone 如何创建通过所有其他视图和控制器保持的视图?

Iphone 如何创建通过所有其他视图和控制器保持的视图?,iphone,objective-c,model-view-controller,user-interface,Iphone,Objective C,Model View Controller,User Interface,我想知道我将如何创建一个视图,该视图通过应用程序中的所有overview和controller持久化。类似于Soundcloud如何在iPhone应用程序中使用音乐播放器(见图)。无论您在应用程序中的哪个位置,音乐播放器视图都位于工具栏下方的顶部 您可以添加一个视图作为主窗口的子视图,并将其放置在Tabbar控制器的视图上方。然后它将始终可见。基本答案是在视图层次结构的顶部创建一个视图 让我们以上面基于选项卡视图的屏幕截图为例。假设应用程序的根视图控制器是UITabBarController的一

我想知道我将如何创建一个视图,该视图通过应用程序中的所有overview和controller持久化。类似于Soundcloud如何在iPhone应用程序中使用音乐播放器(见图)。无论您在应用程序中的哪个位置,音乐播放器视图都位于工具栏下方的顶部


您可以添加一个视图作为主窗口的子视图,并将其放置在Tabbar控制器的视图上方。然后它将始终可见。

基本答案是在视图层次结构的顶部创建一个视图

让我们以上面基于选项卡视图的屏幕截图为例。假设应用程序的根视图控制器是
UITabBarController
的一个子类,称为
RootViewController

通常,您的应用程序委托将有一个类似于以下内容的方法:

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
    [window addSubview:rootViewController.view];
    [window makeKeyAndVisible];
}
如果您希望视图只是“重叠”,这很简单。假设您希望“持久视图”的高度为100像素,并拉伸屏幕宽度。假设您已经为该视图创建了一个类,称为PeristentView。您的代码如下所示:

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
    [window addSubview:rootViewController.view];

    PersistentView* persistentView = [[PersistentView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];
    [window addSubview:persistentView];
    [persistentView release];

    [window makeKeyAndVisible];
}
这里的顺序很重要,因为您希望持久视图位于视图层次结构的下方,因此
rootViewController
视图
首先绘制,然后持久视图再绘制

如果希望持久视图“向下推”屏幕上的其余视图,则必须将其向上修改一点。默认情况下,您告诉窗口将根视图控制器的整个视图添加为子视图,因此您要做的是调整
rootViewController.view的
帧的大小,使其不占用整个屏幕并重新定位其
原点

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
    PersistentView* persistentView = [[PersistentView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];
    [window addSubview:persistentView];
    [persistentView release];

    CGRect frame = rootViewController.view.frame;
    frame.size.height -= persistentView.frame.size.height;
    frame.origin.y += persistentView.frame.size.height;
    rootViewController.view.frame = frame;
    [window addSubview:rootViewController.view];

    [window makeKeyAndVisible];
}
我刚刚用一个现有的基于选项卡栏的项目(使用一个普通的
UIView
,而不是创建一个PersistentView类来引导测试)对此进行了测试,结果很好