在一个UIView中嵌入UIViewController

25
我想在一个UIView中嵌入一个UIViewController,我希望能够以编程方式创建它。我已经在StoryBoard中创建了UIViewController。
创建空UIView的代码:
let myNewView=UIView(frame: CGRect(x: (0 + screenHeight / 2), y: leftView.frame.origin.y, width: screenHeight / 2, height: leftView.frame.height))
myNewView.backgroundColor=UIColor.lightGray

self.view.addSubview(myNewView)

用于将UIViewController附加到视图的代码:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
var controller: UIViewController = storyboard.instantiateViewController(withIdentifier: "testView") as UIViewController
myNewView.addSubview(controller.view)

这会显示我的UIView中的视图,但不是正确的方式。在此情况下,UIView的宽度为512个像素。而(embeded) UIViewcontroller则认为其宽度为1024个像素(全屏宽度)。

我该如何修复嵌入视图从其父级(UIView)获取宽度和高度的问题?


你现在做的完全是错误的。你不能简单地将一个视图控制器的视图添加到你的界面上。至于大小,为添加的视图提供一个“frame”取决于你。但无论如何,你的视图都不会正确工作。 - matt
@matt,有什么好的方法可以做到这一点? - da1lbi3
3个回答

60
正如其他人所说,你不能在一个视图中嵌入一个视图控制器的视图。 你可以将一个视图控制器作为子视图控制器嵌入到另一个视图控制器中。
尝试用以下代码替换你的newView代码:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
var controller: UIViewController = storyboard.instantiateViewController(withIdentifier: "testView") as UIViewController

//add as a childviewcontroller
 addChildViewController(controller)

 // Add the child's View as a subview
 self.view.addSubview(controller.view)
 controller.view.frame = view.bounds
 controller.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

 // tell the childviewcontroller it's contained in it's parent
  controller.didMove(toParentViewController: self)

编辑
要更改子视图控制器的显示方式和位置,只需更新其框架。 例如,要将其高度减半并锚定到底部:

controller.view.frame = CGRect(x: 0, y: view.center.y, width: view.size.width, height: view.size.height * 0.5) 

1
但是我如何将新的视图控制器添加到特定位置?例如仅在屏幕的一半处? - da1lbi3
1
@da1lbi3,您可以通过更新框架来更改原点和大小。请查看我的编辑答案。 - ahbou

16

已更新至最新版本的Swift,并使用UIViewController类的扩展:

extension UIViewController {
    func embed(_ viewController:UIViewController, inView view:UIView){
        viewController.willMove(toParent: self)
        viewController.view.frame = view.bounds
        view.addSubview(viewController.view)
        self.addChild(viewController)
        viewController.didMove(toParent: self)
    }
}

4
你可以拥有一个通用的方法,例如:
func embed(_ viewController:UIViewController, inParent controller:UIViewController, inView view:UIView){
   viewController.willMove(toParent: controller)
   viewController.view.frame = view.bounds
   view.addSubview(viewController.view)
   controller.addChild(viewController)
   viewController.didMove(toParent: controller)
}

希望这能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接