在 UIView 中嵌入 UIViewController
Embed UIViewController inside a UIView
我想在 UIView 中嵌入一个 UIViewController。我想以编程方式创建它。我在故事板中创建了 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 像素。虽然(嵌入式)UIViewcontroller 认为它是 1024 像素宽(全屏宽度)。
如何解决嵌入视图从其父视图(UIView)获取宽度和高度的问题?
正如其他人所说,您不能在视图中嵌入 viewcontroller 视图。
你可以做的是将 ViewController
嵌入另一个 ViewController
作为 ChildViewController
.
尝试将您的 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)
编辑:
要更改 childviewcontroller 出现的方式和位置,只需更新其框架即可。
例如,使其成为高度的一半并固定在底部:
controller.view.frame = CGRect(x: 0, y: view.center.y, width: view.size.width, height: view.size.height * 0.5)
您可以使用如下通用方法:
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)
}
希望对您有所帮助
更新到最新的 swift 并使用了 UIViewController 的扩展 class :
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)
}
}
我想在 UIView 中嵌入一个 UIViewController。我想以编程方式创建它。我在故事板中创建了 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 像素。虽然(嵌入式)UIViewcontroller 认为它是 1024 像素宽(全屏宽度)。
如何解决嵌入视图从其父视图(UIView)获取宽度和高度的问题?
正如其他人所说,您不能在视图中嵌入 viewcontroller 视图。
你可以做的是将 ViewController
嵌入另一个 ViewController
作为 ChildViewController
.
尝试将您的 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)
编辑: 要更改 childviewcontroller 出现的方式和位置,只需更新其框架即可。 例如,使其成为高度的一半并固定在底部:
controller.view.frame = CGRect(x: 0, y: view.center.y, width: view.size.width, height: view.size.height * 0.5)
您可以使用如下通用方法:
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)
}
希望对您有所帮助
更新到最新的 swift 并使用了 UIViewController 的扩展 class :
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)
}
}