将标题视图添加到应用程序中的每个视图

时间:2013-12-10 21:07:22

标签: objective-c

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

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

有谁知道如何正确地做到这一点?我正在使用Xcode 5。

3 个答案:

答案 0 :(得分:1)

您正在其他视图控制器的视图中插入headerControllerindexController的视图。但是,通常,您需要注意保持视图层次结构与视图控制器层次结构同步。 WWDC 2011视频Implementing UIViewController Containment中详细讨论了这一点的重要性。

因此,通常您会实例化相应的indexControllerheaderController,调用addChildViewController,添加子视图,然后为这两个视图控制器中的每一个调用didMoveToParentViewController 。有关详细信息,请参阅适用于iOS的View Controller编程指南的Creating Custom Container View Controllers部分。但您应用的视图控制器可能会执行以下操作:

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重复该过程。

确保(除了执行自定义容器调用之外)要么设置视图控制器框架的frame,要么定义将指示视图放置的自动布局约束(就像您对任何视图一样)以编程方式添加视图)。如果你没有指定框架,它最终可能会CGRectZero,这显然不是你想要的。

但是,你可能会考虑翻转它。创建一个自定义容器视图控制器,其中包含您的标头以及为每个视图保留的任何其他UI元素。然后将您的应用程序的视图控制器作为该容器“父”视图控制器的子控制器。如果标题控制器的视图或索引控制器的视图在各种内容视图控制器之间导航您的应用程序,则这种结构可能更有意义。

我认为如果您观看WWDC video和/或查看Creating Custom Container View Controllers,这将更有意义。

答案 1 :(得分:0)

尝试颠倒两者的顺序:

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

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

答案 2 :(得分:0)

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

你可以有一个看起来像的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