如何在没有情节提要的情况下设置 ViewController 的框架
Posted
技术标签:
【中文标题】如何在没有情节提要的情况下设置 ViewController 的框架【英文标题】:How to set the frame of a ViewController without storyboard 【发布时间】:2019-07-02 16:06:45 【问题描述】:我想在不使用情节提要的情况下使用 ViewController 创建一个视图(例如 100x100)。我想知道声明 ViewController 框架的最佳方式是什么。
我试过了:
class MyLittleViewController: UIViewController
override func viewDidLoad()
super.viewDidLoad()
view.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
我试图在我的 MainViewController 上看到这个视图:
override func viewDidLoad()
super.viewDidLoad()
let myLittleView = MyLittleViewController()
myLittleView.willMove(toParent: self)
myLittleView.view.translatesAutoresizingMaskIntoConstraints = false
myLittleView.view.backgroundColor = .red
view.addSubview(myLittleView.view)
// enable auto-sizing (for example, if the device is rotated)
myLittleView.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
self.addChild(myLittleView)
myLittleView.didMove(toParent: self)
myLittleView.view.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
myLittleView.view.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
它不像我预期的那样工作,因为小视图没有出现在主视图上。有什么提示吗?
【问题讨论】:
【参考方案1】:您不应该将框架布局与自动布局混合设置宽度和高度限制
NSLayoutConstraint.activate([
myLittleView.view.centerXAnchor.constraint(equalTo: view.centerXAnchor),
myLittleView.view.centerYAnchor.constraint(equalTo: view.centerYAnchor),
myLittleView.view.heightAnchor.constraint(equalToConstant:100),
myLittleView.view.widthAnchor.constraint(equalToConstant:100)
])
或
myLittleView.view.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
myLittleView.view.center = view.center
或
override func loadView()
view = UIView()
view.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
编辑:
class ViewController: UIViewController
override func viewDidLoad()
super.viewDidLoad()
self.view.backgroundColor = .green
let myLittleView = MyLittleViewController()
myLittleView.willMove(toParent: self)
myLittleView.view.backgroundColor = .red
view.addSubview(myLittleView.view)
// enable auto-sizing (for example, if the device is rotated)
myLittleView.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
self.addChild(myLittleView)
myLittleView.didMove(toParent: self)
myLittleView.view.center = view.center
class MyLittleViewController: UIViewController
override func loadView()
view = UIView()
view.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
【讨论】:
谢谢,有没有办法在 MyLittleViewController 类中设置框架? 谢谢,现在它可以工作了,以前由于 myLittleView.view.translatesAutoresizingMaskIntoConstraints = false,它没有工作,但我不知道为什么myLittleView.view.translatesAutoresizingMaskIntoConstraints = false
用于以编程方式设置约束
你是对的,但是当我以编程方式设置约束时,我仍然无法使用myLittleView.view.translatesAutoresizingMaskIntoConstraints = false
,但约束有效。【参考方案2】:
另一种设置视图控制器框架的方法是覆盖方法 loadView() 并像这样设置视图框架
func loadView()
view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
【讨论】:
不幸的是,它不起作用:(,当它运行时给我一个错误:线程 1:EXC_BAD_ACCESS (code=2, address=0x16b697ee0)。 @EdoardodeCal 你需要创建一个新视图 @Sh_Khan 我尝试使用: override func loadView() view = UIView(frame: UIScreen.main.bounds) @Sh_Khan 不,它没有 :(,它不显示视图。 是的,我尝试使用您的代码,但视图没有出现。以上是关于如何在没有情节提要的情况下设置 ViewController 的框架的主要内容,如果未能解决你的问题,请参考以下文章