非全屏UINavigationController

时间:2010-06-02 22:47:51

标签: iphone objective-c cocoa-touch

是否可以以不使用完整窗口的方式使用UINavigationController?

我已经尝试设置它的视图框架,并将其视图添加到另一个(非全屏)视图而不是窗口,似乎都不起作用。

4 个答案:

答案 0 :(得分:6)

您无法直接更改UINavigationController或其子视图的大小,因为UINavigationController会自动将它们调整为全屏,无论它们的帧设置如何。到目前为止,我能够克服这个问题的唯一方法如下:

首先,像往常一样创建UINavigationController的实例:

UINavigationController *nc = [[UINavigationController alloc] init];
self.navController = nc;
[nc release];

然后,创建一个UIView实例,约束到你真正想要的大小:

UIView *navView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, DESIRED_HEIGHT)];
navView.clipsToBounds = YES;
[navView addSubview:self.navController.view];   
[self.view addSubview:navView];
[navView release];

navView的clipsToBounds属性必须设置为YES,否则UINavigationController及其视图仍将显示为全屏。然后,将UINavigationController添加到该约束视图。然后可以将此UIView添加到UIViewController的视图中,如上所示。

需要注意的是,添加到UINavigationController的任何UIViewController视图都将其内容限制为navView的边界,而不是添加到UINavigationController的子视图的框架,因此应该正确创建每个子视图中的内容显示navView的边界。

无论如何,这项技术确实有效,因为我已经创建了一个成功使用它的应用程序。我实现这一点的唯一另一种方法是从头开始创建一个自定义导航控制器类,复制UINavigationController的功能,但没有自动调整大小(我过去也做过),这可能是痛苦希望这会有所帮助。

答案 1 :(得分:4)

这是我的第一篇文章,虽然我从这个社区学到了很多东西。所以我想要感谢大家。

我的挑战,以及我在这里发布的原因,是使用iOS5和故事板来回答这个问题并根据我的需要进行重构。这个解决方案可能不适用于旧的实现,但我认为无论如何我都会发布它。

这是我最终得到的结果,它运作良好(iPad应用程序)。这都是在我的默认UIViewController上设置的,在storyboard视图中设置为root。

希望这会有所帮助!

- (void)viewDidLoad
{
    [super viewDidLoad];



    // Do any additional setup after loading the view, typically from a nib.

    /*vars: 
     rightSideView is the containing view - this is where the UINavigationController will sit, along with it's view stack
     myStoryboard is self-explanatory I think
     myViewController is identified as in storyboard as "accountView", to be pulled from the storyboard and used as the rootview
     */


    //Steps

    //Add subview to this controller's view (for positioning)


    UIView *rightSideView = [[UIView alloc]initWithFrame:CGRectMake(30, 30, 500, 600)];
    rightSideView.clipsToBounds = YES;//this little baby makes sure that the damn navigation bar clips!!

    rightSideView.backgroundColor = [UIColor grayColor];//so I can see it

    //instantiate view controller for nav controller's root view
    UIStoryboard *myStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]];
    UIViewController *myViewController = [myStoryboard instantiateViewControllerWithIdentifier:@"accountView"];

    //create NavController
    UINavigationController *myNavController = [[UINavigationController alloc]initWithRootViewController:myViewController];

    //Add navController as one of my child ViewControllers

    [self addChildViewController:myNavController];

    //Add NavController's view into my constrained view
    [rightSideView addSubview:myNavController.view];

    //Finally, add right side view as a subview of myself
    [self.view addSubview:rightSideView];



}

答案 2 :(得分:0)

这可能有帮助吗?

Adding a UINavigationController as a subview of UIView

您可以直接使用UINavigationBar类,并自己实现控制代码。

答案 3 :(得分:0)

这很难回答,因为它很复杂。

在iPhone上,您不能拥有比屏幕短的UINavigationController。 因此,如果您想要展示广告横幅,请将其显示在底部工具栏上方或顶部导航栏下方。

在iPad上你可以并排放置两个UINavigationControllers,但在我的情况下,它们仍然占据屏幕的整个高度。考虑到iPhone的行为,我没有尝试修改iPad上的高度行为。