我有一个标题,我想添加到我的程序中的每个视图。而不是手动执行此操作,我一直在尝试找到一种方法在每个加载的视图上方插入此“标题视图”。在下面的示例中,我尝试使用insertSubView方法,但这会插入整个视图,而不仅仅是我感兴趣的一小部分标题内容。
[self.view insertSubview:self.headerController.view aboveSubview:self.indexController.view];
[self.view insertSubview:self.indexController.view atIndex:0];
有谁知道如何正确地做到这一点?我正在使用Xcode 5。
答案 0 :(得分:1)
您正在其他视图控制器的视图中插入headerController
和indexController
的视图。但是,通常,您需要注意保持视图层次结构与视图控制器层次结构同步。 WWDC 2011视频Implementing UIViewController Containment中详细讨论了这一点的重要性。
因此,通常您会实例化相应的indexController
和headerController
,调用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
,这显然不是你想要的。
我认为如果您观看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