如何添加UIViewController的视图子视图(How to add an UIViewCon

2019-07-19 21:02发布

注意:Google员工,这个QA是再过六年过时了

正如下面米奇和别人提起,这是现在用的容器中的iOS日常的基础上进行。


我有很多控制子视图一个视图控制器。 当我点击我初始化另一个视图 - 控制并显示它的视图,该视图中的子视图按钮之一。 然而,子视图超过帧的边界为子视图和INFACT填满整个屏幕。

可能是什么问题? 我相信这个问题是UIViewController的视图有一个框架(0,0,320,460),因此填满整个屏幕(虽然它收到的触摸事件,只有当子视图框架范围内触及)。 我怎样才能调整大小以适合作为子视图的框架。

总之,我需要帮助添加视图控制器的视图作为一个子视图到另一个视图 - 控制的观点。

谢谢!

Answer 1:

随着iOS 5的的 ,苹果现在允许您进行自定义的容器用于尤其是通过方法如添加一个UIViewController到另一个的UIViewController的目的addChildViewController所以它确实有可能巢UIViewControllers

编辑:包括就地总结,以避免链路中断

我引用:

iOS版提供了许多标准容器来帮助你组织你的应用程序。 不过,有时你需要创建一个自定义工作流不匹配的任何系统的容器提供。 也许在你的视野,你的应用程序需要子视图控制器与专业导航手势或它们之间的过渡动画特定组织。 要做到这一点,你实现自定义容器 - 告诉我更多...

...和:

当你设计一个容器,您创建的容器,家长和其他视图控制器,其子女之间明确的亲子关系 - 告诉我更多

样品(苹果文件提供)添加其他视图控制器的视图容器的视图层次结构

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

干杯,

米奇邓肯



Answer 2:

由于这个家伙,我做到了http://highoncoding.com/Articles/848_Creating_iPad_Dashboard_Using_UIViewController_Containment.aspx

添加的UIView,将其连接到标头:

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

在 - (无效)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];

请享用



Answer 3:

这个答案是旧版本的iOS正确的,但现在已经过时。 您应该使用米奇邓肯的回答,涵盖自定义容器。

别这样! 的的意图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: ,构建子视图)



Answer 4:

我觉得所有这些答案都是不完整的轻微,所以这里是添加一个的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];

willMove自动瓦特/的addChild调用。 由于@iOSSergey

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



Answer 5:

使用:

[self.view addSubview:obj.view];


Answer 6:

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



Answer 7:

您必须设置范围的属性,以适应该帧。 帧它的父属性,和界限限制视图本身坐标系中的帧。



Answer 8:

您可以使用PopupController,它展示的UIViewController作为子视图,您可以查看同一个SDK 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)


文章来源: How to add an UIViewController's view as subview