在哪里将UIViews分组为自定义UIView?

时间:2016-01-31 07:35:56

标签: swift uiview

我正在尝试清理我的viewController并使其变轻。

我在代码中编写UI,并且有一组元素,我想将它们提取到自定义UIView中。我想使用它有点像“容器视图”。然后我会将这个UIView添加到view controller viewController,这会显着降低viewDidLoad()的{​​{1}}功能。

我知道我不能/不应该使用drawRect()。将子视图添加到自定义init()函数或将子视图添加到layoutSubviews()是否更好?或者是否有一个不同的地方用于将子视图及其约束添加到自定义UIView?或者我应该使用UIContainerView吗?

由于

1 个答案:

答案 0 :(得分:0)

这取决于您使用NSLayoutConstraint s还是基于帧的数学。我建议使用NSLayoutConstraint,因为它设置简单。我还发现通过自动布局更容易创建平滑旋转。

如果您使用的是NSLayoutConstraint,则应在init()中初始化,添加和布局子视图。

如果您正在进行基于帧的数学运算,则应初始化并在init()中添加子视图(使用空帧),然后将它们放在layoutSubviews()中。这样就可以为你处理旋转。

对于任何一种情况,我建议将每个子视图设为懒惰的加载器ivar。每个延迟加载程序应为其关联的视图执行所有设置自定义(背景颜色,字体,文本颜色等)。这将允许你的init()方法非常轻。

受控示例:

import UIKit

class AvatarView: UIView {

    init(username: String, rank: String) {
        super.init(frame: CGRectZero)

        usernameLabel.text = username
        rankLabel.text = rank

        self.addSubview(iconView)
        self.addSubview(usernameLabel)
        self.addSubview(rankLabel)

        _layoutViews()
    }

    private func _layoutViews() {
        let views = ["iconView":iconView, "usernameLabel":usernameLabel, "rankLabel":rankLabel]
        self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[iconView]|", options: [], metrics: nil, views: views))
        self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[usernameLabel]|", options: [], metrics: nil, views: views))
        self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-6-[rankLabel]|", options: [], metrics: nil, views: views))
        self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[iconView]-6-[usernameLabel(==20)]|", options: [], metrics: nil, views: views))
        self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-6-[rankLabel]", options: [], metrics: nil, views: views))
    }

    private lazy var usernameLabel: UILabel = {
        let view = UILabel()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.font = UIFont.systemFontOfSize(20)
        view.textColor = UIColor.whiteColor()
        view.textAlignment = .Center
        return view
    }()

    private lazy var rankLabel: UILabel = {
        let view = UILabel()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.font = UIFont.boldSystemFontOfSize(40)
        view.textColor = UIColor.whiteColor()
        return view
    }()

    lazy var iconView: UIImageView = {
        let view = UIImageView()
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    required init?(coder aDecoder: NSCoder) {
        fatalError("unused")
    }
}