如何添加 UIViewController 的视图作为子视图

谷歌人注意,这个 Q-A 现在是 已经过时六年了

正如下面 Micky 和其他人提到的,现在 iOS 中的 集装箱每天都在做这件事。


我有一个控制许多子视图的 ViewController。当我单击其中一个按钮时,我会初始化另一个视图控制器,并将它的视图显示为这个视图的子视图。然而,子视图超出了子视图的框架范围,实际上填充了整个屏幕。

能有什么问题呢?我认为问题在于 UIViewController 的视图有一个帧(0,0,320,460) ,因此填充了整个屏幕(尽管它只在子视图框架范围内接收触摸事件)。如何调整框架大小以适合子视图。

简而言之,我需要帮助将一个 viewcontroller 的视图作为子视图添加到另一个 viewcontroller 的视图中。

谢谢!

119277 次浏览

更改 viewcontroller.view.frame的帧大小,然后添加到 subview.[viewcontrollerparent.view addSubview:viewcontroller.view]

这个答案对于旧版本的 iOS 来说是正确的,但是现在已经过时了。您应该使用 Micky Duncan 的答案,其中包括定制容器。

别这样!UIViewController的意图是驱动整个屏幕。只是不适合做这个,也不会增加任何你需要的东西。

您所需要的只是一个拥有自定义视图的对象。只需使用 UIView本身的一个子类,这样就可以将它添加到窗口层次结构中,并且内存管理是完全自动的。

将子视图 NIB 的所有者指向 UIView的自定义子类。向这个定制子类添加一个 contentView出口,并将其指向笔尖内的视图。在自定义子类中执行以下操作:

- (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:来构建子视图。)

用途:

[self.view addSubview:obj.view];

必须设置边界属性以适应该框架。框架它的 superview 属性,边界限制视图本身的框架坐标系。

感谢这些家伙,我做到了 http://highoncoding.com/Articles/848_Creating_iPad_Dashboard_Using_UIViewController_Containment.aspx

添加 UIView,连接到页眉:

@property (weak, nonatomic) IBOutlet UIView *addViewToAddPlot;

In-(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 5 开始,苹果现在允许你制作 海关集装箱,目的是为了给另一个 UIViewController添加一个 UIViewController,特别是通过诸如 AddChildViewController之类的方法,所以确实可以嵌套 < strong > UIViewController

编辑: 包括现场摘要,以避免链接中断

原话是:

IOS 提供了许多标准容器来帮助您组织应用程序。但是,有时您需要创建一个与任何系统容器所提供的工作流都不匹配的自定义工作流。也许在你的想象中,你的应用程序需要一个特定的 子视图控制器子视图控制器组织,在它们之间有专门的导航手势或动画过渡。告诉我更多..。

还有:

当你设计一个容器的时候,你需要在你的容器、父容器和其他视图控制器之间创建明确的父子关系,它的子容器 -< a href = “ https://developer.apple.com/library/archive/Features uredarticles/ViewControllerPGforiPhoneOS/implementingaContainerViewController.html”rel = “ nofollow norefrer”> 告诉我更多

示例(由 Apple docs 提供)将另一个视图控制器的视图添加到容器的视图层次结构中

- (void) displayContentController: (UIViewController*) content
{
[self addChildViewController:content];
content.view.frame = [self frameForContentController];
[self.view addSubview:self.currentClientView];
[content didMoveToParentViewController:self];
}

我觉得所有这些答案都有点不完整,所以以下是添加 viewController 视图作为另一 viewController 视图的子视图的正确方法:

    [self addChildViewController:viewControllerToAdd];
[self.view addSubview:viewControllerToAdd.view];
[viewControllerToAdd didMoveToParentViewController:self];

如果您愿意,可以将其作为代码片段复制到代码中。SO 似乎并不理解代码替换格式,但是在 Xcode 他们会很干净的显示出来:

    [self addChildViewController:<#viewControllerToAdd#>];
[self.view addSubview:<#viewControllerToAdd#>.view];
[<#viewControllerToAdd#> didMoveToParentViewController:self];

Will Move 被自动调用为 w/addChild. 感谢@iOSSergey

当您的自定义容器调用 addChildViewController: 方法时,它会自动调用视图控制器的 willMoveToParentViewController: 方法,在添加之前将其作为子控制器添加。

您可以同样使用 PopupController 其中一个 SDK 显示 UIViewController 作为子视图 您可以检查 < a href = “ https://github.com/daisuke310vvv/PopupController”rel = “ nofollow norefrer”> PopupController

下面是相同的示例代码

popup = PopupController
.create(self.navigationController!)
.customize(
[
.layout(.center),
.animation(.fadeIn),
.backgroundStyle(.blackFilter(alpha: 0.8)),
.dismissWhenTaps(true),
.scrollable(true)
]
)
.didShowHandler { popup in
}
.didCloseHandler { popup in
}
let container = MTMPlayerAndCardSelectionVC.instance()
container.closeHandler = {() in
self.popup.dismiss()
}


popup.show(container)