1

我有一个 tableviewcontroller 并且在 tableviewcontroller 的相应 rowclick 上我想显示相应行的详细信息内容的详细信息。

行详细信息视图将具有如下固定内容:

  1. 标题
  2. 标题下方的标题
  3. 与标题相关的图像
  4. 这里我想展示 uitabbarcontroller 选项卡按钮的各个视图

在以上几点中,第 1-3 点的内容将覆盖视图控制器页面的一半,这将是固定的,视图控制器的下半部分将具有第 4 点,即各个选项卡按钮的视图,这些视图将根据为各个选项卡创建的视图而改变.

我无法找到任何解决方案来保持视图的上半部分固定。以及如何将标签栏的视图限制在屏幕的下半部分。

我在不使用 storyboard的情况下做这个应用程序。

搜索了很多,但没有得到任何解决方案。

请提供一些示例代码或教程(如果有)。

以下是我在 android 中创建的完全相同的图像。

抱歉需要模糊图像的内容。

在此处输入图像描述

在上图中,以下是我想要修复的内容:

  1. 顶部的蓝色条是标题,它将保持固定。
  2. 标题下方的棕色条和标题下方的白色图像也已修复。
  3. 图片下方的四个按钮是标签栏按钮,在 IOS 中将出现在屏幕底部。
  4. 标签栏按钮下方是包含第一个标签栏按钮内容的视图。

我的问题是我希望修复上述前 2 点,并且应该在屏幕的其余半部分使用 4 个标签栏按钮看到包含各个标签栏按钮视图的视图控制器。

因此,如果我单击任何选项卡按钮,只有屏幕下半部分占据的视图会改变,而上半部分将保持静态(固定)。

希望我的解释能澄清对这个问题的一些疑问。

----基于@Simon McLoughlin 建议的编辑解决方案,以下是代码

我已经实现了一个函数,我在其中编写了代码来实现我的场景。

-(void)loadShowDetailsTabBarController
{
    ConceptViewController *conceptViewController;
    CastViewController *castViewController;
    ShowDetailsFeedbackViewController *showDetailsFeedbackViewController;
    PromosViewController *promoViewController;

    UIImage *conceptBtn = [UIImage imageNamed:@"showdetailstabidle_btn_bg.png"];
    UIImage *conceptBtnSelected = [UIImage imageNamed:@"showdetailstabselected_btn_bg.png"];


    UIImage *castBtn = [UIImage imageNamed:@"showdetailstabidle_btn_bg.png"];
    UIImage *castBtnSelected = [UIImage imageNamed:@"showdetailstabselected_btn_bg.png"];

    UIImage *feedbackBtn = [UIImage imageNamed:@"showdetailstabidle_btn_bg.png"];
    UIImage *feedbackBtnSelected = [UIImage imageNamed:@"showdetailstabselected_btn_bg.png"];

    UIImage *promoBtn = [UIImage imageNamed:@"showdetailstabidle_btn_bg.png"];
    UIImage *promoBtnSelected = [UIImage imageNamed:@"showdetailstabselected_btn_bg.png"];

    conceptBtn = [conceptBtn imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    conceptBtnSelected = [conceptBtnSelected imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

    castBtn = [castBtn imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    castBtnSelected = [castBtnSelected imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

    feedbackBtn = [feedbackBtn imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    feedbackBtnSelected = [feedbackBtnSelected imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

    promoBtn = [promoBtn imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    promoBtnSelected = [promoBtnSelected imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
    {
        conceptViewController = [[ConceptViewController alloc] initWithNibName:@"ConceptViewController_iPad" bundle:nil];

        castViewController = [[CastViewController alloc] initWithNibName:@"CastViewController_iPad" bundle:nil];

        showDetailsFeedbackViewController = [[ShowDetailsFeedbackViewController alloc] initWithNibName:@"ShowDetailsFeedbackViewController_iPad" bundle:nil];

        promoViewController = [[PromosViewController alloc] initWithNibName:@"PromosViewController_iPad" bundle:nil];
    }
    else if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
    {
        conceptViewController = [[ConceptViewController alloc] initWithNibName:@"ConceptViewController" bundle:nil];

        castViewController = [[CastViewController alloc] initWithNibName:@"CastViewController" bundle:nil];

        showDetailsFeedbackViewController = [[ShowDetailsFeedbackViewController alloc] initWithNibName:@"ShowDetailsFeedbackViewController" bundle:nil];

        promoViewController = [[PromosViewController alloc] initWithNibName:@"PromosViewController" bundle:nil];

    }

    conceptViewController.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"CONCEPT" image:conceptBtn selectedImage:conceptBtn];

    castViewController.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"CAST" image:castBtn selectedImage:castBtnSelected];

    showDetailsFeedbackViewController.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"FEEDBACK" image:feedbackBtn selectedImage:feedbackBtnSelected];

    promoViewController.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"PROMO" image:promoBtn selectedImage:promoBtnSelected];/**/

    UITabBarController *showDetailstabVC = [[UITabBarController alloc] init];

    showDetailstabVC.viewControllers = [NSArray arrayWithObjects:conceptViewController,castViewController,showDetailsFeedbackViewController,promoViewController, nil];

    showDetailstabVC.view.frame = CGRectMake(0, 250, screenSize.width, screenSize.height-250);

    self.view.window.rootViewController = showDetailstabVC;

    [self.view addSubview:showDetailstabVC.view];
}

请让我知道我的代码是否正确?

我可以看到我想要的。

但是现在的问题是,当我单击标签栏按钮时,出现以下错误:

exc_bad_access(代码=exc_i386_gpflt)

调试屏幕中未给出错误,应用程序在main.m中的以下行停止:

返回 UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

4

1 回答 1

1

好的,事实证明您要实现的是UIViewController垂直拆分。上半部分是静态的,下半部分包含UITabbarController将显示UIViewControllers的仅占用UITabbar和静态视图之间的空间。

我认为这可以通过制作UITabbarController一个孩子来完成,但我可能错了。UIViewController通过简单地设置框架,我之前在屏幕上有 3 个孩子。您在上面说过,这对您不起作用,所以我看到剩下 2 个选项。

  1. 您将所有选项卡内容创建得更小。因此,例如说顶视图的高度为 100px。在UIViewController选项卡中的 's 中,只需将UITableView(或视图或任何内容)的框架设置为其Y值从 100px 开始。在我看来,这是一个相当糟糕的解决方案,但它需要最少的努力。

  2. 您创建了一个“主” UIViewController,在顶部有一个静态部分,并在UIScrollView启用分页的情况下水平滚动。并将个人UIViewController作为子视图控制器添加到其中。不确定您是否可以创建 aTabbar并监听事件并使用它以编程方式滚动它,或者您是否必须创建自己的UIView看起来像 aTabbar并在其上放置按钮以向左/向右滚动。

第二种方法是相当普遍的做法。我已经开发了一些已经完成它的应用程序,并且在网上看到了很多关于如何实现它的帖子。像这样:如何将 viewController 放入 UIScrollView。它只需要以递增的X值添加子视图控制器并将滚动视图的内容大小设置为总数。打开分页,关闭垂直滚动。

于 2014-02-27T14:01:22.513 回答