UIView 布局子视图通知
UIView layoutSubviews notification
我有一个关于 UIView layoutSubviews 的问题
class ViewController: UIViewController {
let v1 = SubView1()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
view.addSubview(v1)
v1.frame = CGRect(x: 50, y: 50, width: 70, height: 30)
}
}
class SubView1: UIView {
let subView = SubView2()
override func layoutSubviews() {
super.layoutSubviews()
print("layoutSubviews SubView1")
}
override init(frame: CGRect) {
super.init(frame: frame)
var frame = subView.frame
frame.origin = CGPoint(x: 0, y: 0)
frame.size.width = 50
subView.frame = frame
addSubview(subView)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class SubView2: UIView {
let label = UILabel()
override func layoutSubviews() {
super.layoutSubviews()
print("layoutSubviews SubView2")
var frame = label.frame
frame.origin = CGPoint(x: 10, y: 10)
frame.size.width = self.frame.width - 20
label.frame = frame
label.sizeToFit()
frame = self.frame
frame.size.height = label.frame.size.height + 20
self.frame = frame
}
override init(frame: CGRect) {
super.init(frame: frame)
label.numberOfLines = 0
label.text = "test test test test test test test test"
addSubview(label)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
此代码打印:
layoutSubviews 子视图 1
layoutSubviews SubView2
我想调整 SubView1,使 SubView1 环绕 SubView2。
但是 SubView2'frmae 是在 'layoutSubviews SubView2' 调用时确定的。
(我不知道 'layoutSubviews SubView1')
我想知道如何在'layoutSubviews SubView2'
之后通知SubView1
你接近的方式很艰难。我对实现您想要的目标的建议如下
- 使用自动布局
使用自动布局约束来布局您想要的布局。这是制作生产应用程序的实用方法。
- 没有自动布局
如果您坚持不使用自动布局,那么请使用“viewDidLayoutSubviews”回调。这是一个视图控制器回调,当视图控制器布置了所有视图时调用。在这里你肯定知道,这个视图控制器中的所有子视图都是值得称赞的。
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621398-viewdidlayoutsubviews
其中我更喜欢自动布局,因为有很多事情需要解决,而不是在 ios 应用程序中布局视图。
我有一个关于 UIView layoutSubviews 的问题
class ViewController: UIViewController {
let v1 = SubView1()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
view.addSubview(v1)
v1.frame = CGRect(x: 50, y: 50, width: 70, height: 30)
}
}
class SubView1: UIView {
let subView = SubView2()
override func layoutSubviews() {
super.layoutSubviews()
print("layoutSubviews SubView1")
}
override init(frame: CGRect) {
super.init(frame: frame)
var frame = subView.frame
frame.origin = CGPoint(x: 0, y: 0)
frame.size.width = 50
subView.frame = frame
addSubview(subView)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class SubView2: UIView {
let label = UILabel()
override func layoutSubviews() {
super.layoutSubviews()
print("layoutSubviews SubView2")
var frame = label.frame
frame.origin = CGPoint(x: 10, y: 10)
frame.size.width = self.frame.width - 20
label.frame = frame
label.sizeToFit()
frame = self.frame
frame.size.height = label.frame.size.height + 20
self.frame = frame
}
override init(frame: CGRect) {
super.init(frame: frame)
label.numberOfLines = 0
label.text = "test test test test test test test test"
addSubview(label)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
此代码打印:
layoutSubviews 子视图 1
layoutSubviews SubView2
我想调整 SubView1,使 SubView1 环绕 SubView2。
但是 SubView2'frmae 是在 'layoutSubviews SubView2' 调用时确定的。
(我不知道 'layoutSubviews SubView1')
我想知道如何在'layoutSubviews SubView2'
之后通知SubView1你接近的方式很艰难。我对实现您想要的目标的建议如下
- 使用自动布局 使用自动布局约束来布局您想要的布局。这是制作生产应用程序的实用方法。
- 没有自动布局 如果您坚持不使用自动布局,那么请使用“viewDidLayoutSubviews”回调。这是一个视图控制器回调,当视图控制器布置了所有视图时调用。在这里你肯定知道,这个视图控制器中的所有子视图都是值得称赞的。
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621398-viewdidlayoutsubviews
其中我更喜欢自动布局,因为有很多事情需要解决,而不是在 ios 应用程序中布局视图。