如何将UIViewController的视图添加为子视图
请注意谷歌,这个QA现在已经过了六年 !
正如下面的Micky和其他人所提到的,现在这些工作已经在iOS平台上与Containers一起完成了。
我有一个控制许多子视图的ViewController。 当我点击其中一个按钮时,我初始化另一个视图控制器并将它的视图显示为此视图的子视图。 然而,子视图超出子视图框架的边界,并且infact填充整个屏幕。
什么可能是错的? 我认为问题是,UIViewController的视图有一个框架(0,0,320,460),因此填充整个屏幕(尽管它只在触摸子视图范围内接收触摸事件)。 我如何调整框架以适合子视图。
总之,我需要帮助将viewcontroller的视图作为子视图添加到另一个viewcontroller的视图。
谢谢!
从iOS 5开始,Apple现在允许您创建自定义容器,以便将UIViewController添加到另一个UIViewController,特别是通过addChildViewController等方法,因此可以嵌套UIViewControllers
编辑:包括就地总结,以避免链接断裂
我引用:
iOS提供了许多标准容器来帮助您组织应用程序。 但是,有时您需要创建与任何系统容器不匹配的自定义工作流。 也许在你看来 ,你的应用需要一个特定的子视图控制器组织,它们之间有特殊的导航手势或动画转换。 要做到这一点,你需要实现一个自定义容器 - 告诉我更多...
...和:
当你设计一个容器时,你可以在容器,父级和其他视图控制器,它的子级之间创建显式的父子关系 - 告诉我更多
示例(Apple文档提供)将另一个视图控制器的视图添加到容器的视图层次结构中
- (void) displayContentController: (UIViewController*) content
{
[self addChildViewController:content];
content.view.frame = [self frameForContentController];
[self.view addSubview:self.currentClientView];
[content didMoveToParentViewController:self];
}
干杯,
米奇邓肯
感谢这些人,我做到了http://highoncoding.com/Articles/848_Creating_iPad_Dashboard_Using_UIViewController_Containment.aspx
添加UIView,将其连接到标题:
@property (weak, nonatomic) IBOutlet UIView *addViewToAddPlot;
在 - (void)viewDidLoad中做到这一点:
ViewControllerToAdd *nonSystemsController = [[ViewControllerToAdd alloc] initWithNibName:@"ViewControllerToAdd" bundle:nil];
nonSystemsController.view.frame = self.addViewToAddPlot.bounds;
[self.addViewToAddPlot addSubview:nonSystemsController.view];
[self addChildViewController:nonSystemsController];
[nonSystemsController didMoveToParentViewController:self];
请享用
这个答案对于旧版本的iOS是正确的,但现在已经过时。 你应该使用Micky Duncan的答案,它涵盖了自定义容器。
不要这样做! UIViewController
的目的是驱动整个屏幕。 它只是不适合这个,它并没有真正添加任何你需要的东西。
所有你需要的是一个拥有你自定义视图的对象。 只需使用UIView
本身的一个子类,它就可以添加到窗口层次结构中,并且内存管理是完全自动的。
将子视图NIB的所有者指向UIView
的自定义子类。 将contentView
添加到此自定义子类中,并将其指向nib中的视图。 在自定义子类中执行如下操作:
- (id)initWithFrame: (CGRect)inFrame;
{
if ( (self = [super initWithFrame: inFrame]) ) {
[[NSBundle mainBundle] loadNibNamed: @"NibNameHere"
owner: self
options: nil];
contentView.size = inFrame.size;
// do extra loading here
[self addSubview: contentView];
}
return self;
}
- (void)dealloc;
{
self.contentView = nil;
// additional release here
[super dealloc];
}
(我假设你在使用initWithFrame:
构造子视图。)