iOS AutoLayout – 获取框架大小的宽度
我正在开发使用iOS 6自动布局
我想logging显示视图的帧宽度的消息。
我可以在屏幕上看到textView。
但我得到的宽度和高度为零,我错过了什么?
NSLog(@"textView = %p", self.textView); NSLog(@"height = %f", self.textView.frame.size.height); NSLog(@"width = %f", self.textView.frame.size.width); textView = 0x882de00 height = 0.000000 width = 0.000000
我认为自动布局在您打电话时没有时间布置您的视图。 在viewDidLoad
被调用的时候,自动布局并没有发生,因为在视图被加载之后才调用它,只有在视图被放置到视图控制器的视图层次结构中并最终布局(在视图的layoutSubviews
方法中)之后才会调用它。
编辑:这个答案指出为什么在这个问题的场景不起作用。 @ dreamzor的答案指出为了解决这个问题 ,在哪里放置你的代码。
其实上面的答案不太对。 我跟着他们,一次又一次地得到了零。
诀窍是把你的框架相关代码放在viewDidLayoutSubviews
方法中
通知视图控制器,它的视图只是布局它的子视图。
不要忘记,这个方法被多次调用,而不是ViewController的生命周期的一部分,所以使用这个时要小心。
希望对某人有所帮助。
只是想补充说,对于我的程序没有横向模式不使用自动布局是简单得多…我试过,虽然= D
解
- 将该代码放在
viewDidAppear
原因
-
viewDidLoad
在自动布局完成之前发生。 所以这个位置还没有被在xib中指定的自动布局设置 -
viewDidAppear
发生在自动布局完成后。
包含在你的viewDidLoad()
self.view.setNeedsLayout() self.view.layoutIfNeeded()
在访问您的view.frame.size.width之前
其实我设法强制布局更新之前,我的代码在viewDidLoad
:
override func viewDidLoad() { super.viewDidLoad() println("bounds before \(self.previewContainer.bounds)"); //on iPhone 6 plus -> prints bounds before (0.0,0.0,320.0,320.0) self.view.setNeedsLayout() self.view.layoutIfNeeded() println("bounds after \(self.previewContainer.bounds)"); //on iPhone 6 plus -> prints bounds after (0.0,0.0,414.0,414.0) //Size dependent code works here self.create() }
更新 :这似乎不工作了
这真是奇特的function。 但是我发现:
如果你想获取框架而不使用layoutsubviews方法,使用这个:
dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"View frame: %@", NSStringFromCGRect(view.frame)); });
这真是奇怪!
除了viewDidLoad
之外,上面所有的答案都不是完全适用于我的,但是这样做的副作用是直到视图animation之后才显示我想要的内容。
viewDidLayoutSubviews
应该是运行依赖于自动布局完成的代码的正确位置,但是正如其他人指出的那样,它在最近的iOS版本中被多次调用,并且您无法知道哪个是最终的调用。
所以我解决了这个小黑客。 在我的故事板中, mySubview
应该小于其包含的self.view
。 但是,当viewDidLayoutSubviews
第一次被调用, mySubview
仍然有600的宽度,而self.view
似乎设置正确(这是一个iPhone项目)。 所以我所要做的就是监视后续的调用并检查相对宽度。 一旦mySubview
比mySubview
小,我可以确定它已经正确地布置。
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() if self.mySubview.bounds.size.width < self.view.bounds.size.width { // mySubview's width became less than the view's width, so it is // safe to assume it is now laid out correctly... } }
这具有不依赖硬编码数字的优势,例如,它可以在所有iPhone外形上工作。 当然,在所有情况下或在所有设备上,它可能不是万能的,但是可能有许多巧妙的方法来做相似尺寸的类似检查。
不,我们不应该这样做,但直到苹果给我们一些更可靠的callback,我们都坚持下去。
iOS AutoLayout – 获取框架大小的宽度
-(void) layoutSubviews{ [self layoutIfNeeded]; //right you code to set frame its will work to get frame and set frame. CALayer *bottomBorder = [CALayer layer]; bottomBorder.frame = CGRectMake(0.0f, bkView.frame.size.height - 1, bkView.frame.size.width, 1.0f); bottomBorder.backgroundColor = [UIColor blackColor].CGColor; [bkView.layer addSublayer:bottomBorder]; }
您只能在第一个布局过后查找大小。 或者只要调用下面的方法,然后你有实际的宽度你查看。
[yourView layoutIfNeeded];