![](/img/trans.png)
[英]How can I get the frame of a UIView subclass using Autolayout with Storyboard?
[英]Get UIView frame using autolayout after http request
我仍然不明白在使用自动布局时如何获取UIView
的更新框架。
假设我:
我应该怎么做?
我的猜测,但这是错误的:
layoutMyViews()
makeHttpRequest(callback)
func callback(data: MyData) {
drawData(data, into:dataView)
}
func drawData(data: MyData, into view:UIView) {
let size = view.frame.size
// Here I want to draw data into view, depending on size, but it may be (0,0)
}
这只是一个示例UIViewController-您可以在视图加载并阻止ui或至少指示活动时启动视图调用,然后在该调用完成时可以根据所需的任何当前视图属性来更新UI。
class ViewController: UIViewController {
// You can start accessing view properties from the storyboard here.
override func viewDidLoad() {
super.viewDidLoad()
print(self.view.frame) // Outputs the frame of the view controller's view.
// Do any additional setup after loading the view, typically from a nib.
}
override func viewDidLayoutSubviews() {
}
override func viewWillAppear(animated: Bool) {
}
override func viewDidAppear(animated: Bool) {
}
}
这或多或少是我现在正在做的事情。 如果有人可以提出更好的选择,请发表评论。
正如您将看到的那样,在drawDataIfPossible()
我检查了是否设置了data
并设置了帧大小。 我都检查了一下,因为drawDataIfPossible()
两个函数调用了drawDataIfPossible()
:
drawData(data: MyData)
,可以在设置帧大小之前调用 layoutSubviews()
,可以在设置data
之前调用它。 。
class Controller : UIViewController {
// Here I will draw some data that comes from server
var dataView: MyDataView!
override func viewDidLoad() {
super.viewDidLoad()
// Here I add the views using autolayout, including dataView
layoutMyViews()
// Here I make the http request to get data
makeHttpRequest(callback)
}
/** When the data comes, I tell the dataView to draw itself */
func callback(data: MyData) {
dataView.drawData(data)
}
//...
}
class MyDataView : UIView {
var data: MyData!
/** Draws the data in the view */
func drawData(data: MyData) {
self.data = data
drawDataIfPossible()
}
func drawDataIfPossible() {
// Here I check I have the data and that the frame size is set
if data != nil && frame.size.width > 0 {
drawData()
}
}
/** Draws data in the view (needs the frame size) */
func drawData {
// ...
}
override func layoutSubviews()
{
super.layoutSubviews()
layoutIfNeeded() // seems to be necessary for the frame size to be set
drawDataIfPossible()
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.