2014-12-26 31 views
18

我是一名新的开发人员iOS。如何通过自动布局获得实际大小的UIView

我使用自动布局。

我有一个问题。约束后我无法获得真实大小的UIView。

例如,当我想要得到的UIView大小与约束

self.container.frame.size.height 

它送花儿给人的所有设备大小返回550。但是当我在不同的设备上运行它时,我可以看到它有不同的大小。

感谢

回答

11

最简单的解决方法就是运行-viewDidAppear:代码(自动版式已运行后)。

+0

感谢。但如何做,如果我想在viewDidLoad中获得真正的大小。你有任何解决方案? – Chicken

+0

@Chicken见艾伦的解决方案。这将强制自动布局立即运行。你真的应该避免做这种事情,尤其是不止一次。 – Oxcug

0

最好的时刻是在viewDidLayoutSubviews期间,因为它发生在viewDidAppear之前,因此您仍然可以在显示视图之前做一些修改。

35

你的 “得到真正的尺寸代号” 之前,插入下面的代码:

[view setNeedsLayout]; 
[view layoutIfNeeded]; 
+2

恕我直言,不需要同时调用'[view setNeedsLayout]'和'[view layoutIfNeeded]',只有后者对于'viewWillLayoutSubviews'中的我来说已经足够了。 – schmidt9

+0

它不起作用 –

13

由于每个人都认为访问是通过完成的而不是在UIView子类中,答案并不证明真的有用。获得UIView子类的正确大小的正确方法是layoutSubviews

0

[view layoutIfNeed]救救我。

使用此方法可在绘制之前强制子视图的布局。使用接收消息作为根视图的视图,此方法将从根开始的视图子树布局。

调用此方法后,我可以在xib中获得自定义视图的实际大小。 非常感谢@Allen和作者。

6

这太棒了。

如果你想获得帧没有自动布局在使用过程中使用layoutsubviews方法,使用这一个:

dispatch_async(dispatch_get_main_queue(), ^{ 
     NSLog(@"View frame: %@", NSStringFromCGRect(view.frame)); 
    }) 
+0

谢谢你的想法。这里没有什么奇怪的:你在回到主调度队列后要求调用这个代码。这将在自动布局发生后发生。的确非常有用! – ishahak

+1

谢谢。萨姆说并不奇怪。也是比这个子类更好的解决方案。 –

相关问题