在视图代码类文件

时间:2018-03-21 20:59:27

标签: ios swift constraints subview addsubview

我目前正试图在Swift中以编程方式学习约束和样式。我还试图通过拆分与“样式”相关的代码来维护干净和模块化的代码。

我只是拥有LoginViewController

import UIKit

class LoginViewController: UIViewController {

    var loginView: LoginView!

    override func viewDidLoad() {
        super.viewDidLoad()

        loginView = LoginView(frame: CGRect.zero)
        self.view.addSubview(loginView)

        // AutoLayout
        loginView.autoPinEdgesToSuperviewEdges(with: UIEdgeInsets.zero, excludingEdge: .bottom)
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

}

然后是我的LoginView

import UIKit

class LoginView: UIView {
    var shouldSetupConstraints = true

    var headerContainerView: UIView!

    override init(frame: CGRect) {
        super.init(frame: frame)

        // Header Container View
        headerContainerView = UIView(frame: CGRect.zero)
        headerContainerView.backgroundColor = UIColor(red:0.42, green:0.56, blue:0.14, alpha:1.0) // #6B8E23
        headerContainerView.translatesAutoresizingMaskIntoConstraints = false

        self.addSubview(headerContainerView)

        headerContainerView.topAnchor.constraint(equalTo: self.superview!.topAnchor)

    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func updateConstraints() {
        if(shouldSetupConstraints) {
            // AutoLayout constraints
            shouldSetupConstraints = false
        }
        super.updateConstraints()
    }
}

我遇到困难的只是尝试将此headerContainerView添加到superview的顶部。我希望能够添加它,使其自身固定在superview的顶部,左侧和右侧,并且只有superview's高度的1/3。我继续尝试引用superview但没有成功,我找不到可以帮助我理解互联网的解决方案。关于我如何完成这个的任何建议?

感谢您抽出时间回复。

注意:我确实开始使用PureLayout,这非常好。但是,我是一个喜欢了解幕后发生的事情或者至少如何在基层编写代码的人。您可以看到我在PureLayout中使用LoginViewController函数,但我希望更改它。我更喜欢不添加第三方库的解决方案。

3 个答案:

答案 0 :(得分:1)

自定义self类中的UIViewheaderContainerView的父视图,因此,您可以添加此内容,我建议首先学习约束,不要使用第三方库来完全理解这个概念,你将从看到冲突和其他事情中学到很多东西,一旦完成,转移到图书馆

override init(frame: CGRect) {
    super.init(frame: frame)

    // Header Container View
    headerContainerView = UIView(frame: CGRect.zero)
    headerContainerView.backgroundColor = UIColor(red:0.42, green:0.56, blue:0.14, alpha:1.0) // #6B8E23
    headerContainerView.translatesAutoresizingMaskIntoConstraints = false

    self.addSubview(headerContainerView)
    headerContainerView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
    headerContainerView.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
    headerContainerView.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
    headerContainerView.heightAnchor.constraintEqualToAnchor(self.heightAnchor, multiplier:1.0/3.0, constant: 0.0).active = true

}

// loginView布局

override func viewDidLoad() {
    super.viewDidLoad()

    loginView = LoginView(frame: CGRect.zero)
    self.view.addSubview(loginView)
    loginView.translatesAutoresizingMaskIntoConstraints = false
    loginView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
    loginView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
    loginView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true
    loginView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true

答案 1 :(得分:0)

headerContainerView.snp.makeConstraints { (make) in
        make.top.equalTo(self)
        make.leading.and.trailing.equalTo(self)
        make.height.equalTo(self.frame.height/3)
    }

使用SnapKit

答案 2 :(得分:0)

使用SnapKit,您可以执行以下操作:

override func viewDidLoad() {
    super.viewDidLoad()

    loginView = LoginView(frame: CGRect.zero)
    self.view.addSubview(loginView)

    // AutoLayout
    loginView.snp.makeConstraints { (make) in
        make.left.equalTo(view.snp.left)
        make.right.equalTo(view.snp.right)
        make.top.equalTo(view.snp.top)
        make.height.equalTo(view.snp.height).multipliedBy(1/3)
    }
}