我正在尝试清理我的viewController
并使其变轻。
我在代码中编写UI,并且有一组元素,我想将它们提取到自定义UIView
中。我想使用它有点像“容器视图”。然后我会将这个UIView
添加到view controller
viewController
,这会显着降低viewDidLoad()
的{{1}}功能。
我知道我不能/不应该使用drawRect()
。将子视图添加到自定义init()
函数或将子视图添加到layoutSubviews()
是否更好?或者是否有一个不同的地方用于将子视图及其约束添加到自定义UIView
?或者我应该使用UIContainerView
吗?
由于
答案 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")
}
}