【问题标题】:How to set the frame of a ViewController without storyboard如何在没有情节提要的情况下设置 ViewController 的框架
【发布时间】: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
}

它不像我预期的那样工作,因为小视图没有出现在主视图上。有什么提示吗?

【问题讨论】:

    标签: ios swift view viewcontroller


    【解决方案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 不,它没有 :(,它不显示视图。
    • 是的,我尝试使用您的代码,但视图没有出现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多