Objective c 向应用程序中的每个视图添加标题视图

Objective c 向应用程序中的每个视图添加标题视图,objective-c,Objective C,我有一个标题,我想添加到我的程序中的每个视图。我一直在试图找到一种方法,在每个加载的视图上方插入这个“标题视图”,而不是手动执行此操作。在下面的示例中,我尝试使用insertSubView方法,但这会插入整个视图,而不仅仅是我感兴趣的一小部分标题内容 [self.view insertSubview:self.headerController.view aboveSubview:self.indexController.view]; [self.view insertSubview:self.i

我有一个标题,我想添加到我的程序中的每个视图。我一直在试图找到一种方法,在每个加载的视图上方插入这个“标题视图”,而不是手动执行此操作。在下面的示例中,我尝试使用insertSubView方法,但这会插入整个视图,而不仅仅是我感兴趣的一小部分标题内容

[self.view insertSubview:self.headerController.view aboveSubview:self.indexController.view];
[self.view insertSubview:self.indexController.view atIndex:0];   

有人知道如何正确地做到这一点吗?我使用的是Xcode 5。

请尝试颠倒两种代码的顺序:

[self.view insertSubview:self.indexController.view atIndex:0]; 
[self.view insertSubview:self.headerController.view aboveSubview:self.indexController.view];

另外,由于
headerController
是一个UIViewController,它可能有一个默认大小为全屏的nib文件。如果只想保持一定的高度,则必须使用适当的高度修改该nib文件。

您将在其他视图控制器的视图中插入
标题控制器
索引控制器
的视图。但是,通常情况下,在保持视图层次结构与视图控制器层次结构同步时要小心。WWDC 2011视频中详细讨论了这一点的重要性

因此,通常您会实例化相应的
indexController
headerController
,调用
addChildViewController
,添加子视图,然后为这两个视图控制器中的每一个调用
didMoveToParentViewController
。有关更多信息,请参阅《iOS视图控制器编程指南》的一节。但应用程序的视图控制器可能会执行以下操作:

HeaderController *headerController = ...                       // instantiate however is appropriate
[self addChildViewController:headerController];        
headerController.view.frame = [self frameForHeaderController]; // define the frame/constraints as appropriate
[self.view addSubview:headerController];
[headerController didMoveToParentViewController:self]; 
然后对
indexController
重复该过程

只需确保(除了执行自定义容器调用外)设置视图控制器框架的
框架
,或者定义自动布局约束,这些约束将指示视图的位置(就像您对任何以编程方式添加的视图所做的那样)。如果不指定帧,它很可能最终成为
CGRectZero
,这显然不是您想要的

不过,你可以考虑把这个翻过来。制作一个自定义的容器视图控制器,其中包含头和任何其他UI元素,这些元素在每个视图中都保持不变。然后将应用程序的视图控制器设置为该容器的子控制器“父”视图控制器。如果标题控制器的视图或索引控制器的视图在不同的内容视图控制器之间导航应用程序,这种结构可能更有意义

我认为如果您观看和/或查看,这将更有意义。

我建议创建一个基本视图,您将从中为需要此标题的每个视图创建子类

您可以有一个BaseView.h,它看起来像:

@interface BaseView : UIView
@property (nonatomic) UIView *someHeaderView;
@end
实现(.m)如下所示:

@implementation BaseView
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.headerView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, CGRectGetWidth(frame), 150.0)];
        [self.view addSubview:self.headerView];
    }
    return self;
}
@end
然后让每个需要标题子类的视图:

@interface SomeViewRequiringHeader : BaseView
@end

谢谢我刚读了这篇文章。我称之为“self”的实际控制器可以说是我的容器。为了形成一个新页面,我试图让标题和索引视图出现在它的顶部,以形成索引页面。我认为我的问题是控制标题视图的大小。我仍然在玩帧设置。我会让您知道这是否有效,但到目前为止,控制视图大小的任何内容都不是直观的。@UsmanMutawakil通常,在添加子视图控制器(以及执行那些包含调用)时,会在NIB/情节提要(历史上称为“容器”视图)上使用占位符
UIView
。然后,当以编程方式添加子视图控制器的视图时,我将其添加到该容器视图中,并将视图控制器的视图的
框架
设置为与容器视图的
边界
相同。它使我摆脱了手动计算视图控制器视图的
帧的场景。如果在iOS 6及更高版本中使用故事板,则会出现带有嵌入segue的容器视图对象(甚至更简单)。这就是我最终所做的,唯一的区别是我将UIViewController子类化,然后向下滑动其视图的位置,但结果是相同的想法。