如何在没有情节提要的情况下设置 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 的框架的主要内容,如果未能解决你的问题,请参考以下文章

在没有情节提要的情况下使用 UITableView

如何在没有情节提要的情况下使用按钮切换视图?

如何在没有情节提要的情况下以编程方式实例化视图控制器

如何在没有情节提要的情况下实现 Size-Class-Specific Layout?

使用 Swift 在没有情节提要的情况下展开 segue

没有情节提要或图像的 iOS 启动图像