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 

9 Solutions collect form web for “iOS AutoLayout – 获取框架大小的宽度”

我认为自动布局在您打电话时没有时间布置您的视图。 在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项目)。 所以我所要做的就是监视后续的调用并检查相对宽度。 一旦mySubviewmySubview小,我可以确定它已经正确地布置。

 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]; 
  • 如何使用NSLog进行debugging(@“iPhone模拟器内部”)?
  • 警告:“格式不是string文字和格式参数”
  • 在debugging模式下启用和禁用NSLog