imageView
内有ovalView
约束了自动布局。
在viewDidLayoutSubviews()
内,我正在创建一个UILabel
let label = UILabel(frame: imageView.frame)
imageView.superview?.addSubview(label)
标签框显示与imageView略微偏离中心。
但是,如果我将上面的代码移到viewDidAppear()
中,则label完全以imageView为中心,但用户会看到不希望的更改。
如何将代码保存在viewDidLayoutSubviews()
并使其正常工作?
答案 0 :(得分:1)
调用viewDidAppear
时,您无法在调用该方法之前假设您的视图具有最终帧。在你的情况下,发生了什么。当您致电viewDidAppear
时,您的视图已经绘制了所有框架,并且您获得了正确的框架,这就是为什么它适合您。因此,请在class MyTableViewController: UITableViewController {
private var kvoContext = 0
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
addObserver(self, forKeyPath: #keyPath(tableView.contentSize), options: .new, context: &kvoContext)
}
override func viewDidDisappear(_ animated: Bool) {
removeObserver(self, forKeyPath: #keyPath(tableView.contentSize))
super.viewDidDisappear(animated)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if context == &kvoContext, keyPath == #keyPath(tableView.contentSize),
let contentSize = change?[NSKeyValueChangeKey.newKey] as? CGSize {
self.popoverPresentationController?.presentedViewController.preferredContentSize = contentSize
}
}
}
中调用它。
答案 1 :(得分:1)
对于其他可能面临类似问题的人。我可以通过添加
将代码保留在viewDidLayoutSubviews()
中
self.view.layoutIfNeeded()
之后的代码中的
let label = UILabel(frame: imageView.frame)
imageView.superview?.addSubview(label)