在ViewDidLayoutSubviews中定义时,帧位置不正确

时间:2017-10-13 18:37:56

标签: swift viewdidappear viewdidlayoutsubviews

imageView内有ovalView约束了自动布局。

viewDidLayoutSubviews()内,我正在创建一个UILabel

let label = UILabel(frame: imageView.frame)
imageView.superview?.addSubview(label)

标签框显示与imageView略微偏离中心。

但是,如果我将上面的代码移到viewDidAppear()中,则label完全以imageView为中心,但用户会看到不希望的更改。

如何将代码保存在viewDidLayoutSubviews()并使其正常工作?

2 个答案:

答案 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)