【发布时间】:2014-12-26 05:45:36
【问题描述】:
我是一名 iOS 新开发者。
我使用自动布局。
我有问题。约束后我无法获得 UIView 的实际大小。
例如,当我想通过约束获得 UIView 的大小时
self.container.frame.size.height
对于所有设备大小,它总是返回 550。但是当我在不同的设备上运行它时,我可以看到它有不同的大小。
谢谢
【问题讨论】:
标签: ios autolayout ios-autolayout
我是一名 iOS 新开发者。
我使用自动布局。
我有问题。约束后我无法获得 UIView 的实际大小。
例如,当我想通过约束获得 UIView 的大小时
self.container.frame.size.height
对于所有设备大小,它总是返回 550。但是当我在不同的设备上运行它时,我可以看到它有不同的大小。
谢谢
【问题讨论】:
标签: ios autolayout ios-autolayout
在您的“获取实际尺寸代码”之前,插入以下代码:
[view setNeedsLayout];
[view layoutIfNeeded];
【讨论】:
[view setNeedsLayout] 和[view layoutIfNeeded],viewWillLayoutSubviews 对我来说只有后者就足够了
由于每个人都假设访问是通过 UIViewController 而不是在 UIView 子类中完成的,因此这些答案并没有真正有用。获得UIView 子类的正确大小的正确方法是在layoutSubviews 中。
【讨论】:
最简单的解决方案是在-viewDidAppear: 中运行该代码(在运行自动布局之后)。
【讨论】:
好像- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize; 就是你要找的东西:
返回值
满足它所持有的约束的视图的大小。讨论
考虑到它拥有的所有约束及其子视图的约束,确定视图的最佳大小。
【讨论】:
你可以使用UIView方法intrinsicContentSize
【讨论】:
intrinsicContentSize 忽略(顾名思义,并且在上面的屏幕截图中也提到)所有影响视图的约束。例如,标签的固有内容大小就是显示标签文本所需的框架。但是,如果您的标签具有“宽度
这太棒了。
如果你想在 autolayout 使用过程中不使用 layoutsubviews 方法获取框架,使用这个:
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"View frame: %@", NSStringFromCGRect(view.frame));
})
【讨论】:
[查看 layoutIfNeed] 救救我。
使用此方法在绘制之前强制子视图的布局。该方法使用接收消息的视图作为根视图,从根开始布局视图子树。
调用此方法后,我可以在 xib 中获取自定义视图的实际大小。 非常感谢@Allen 和作者。
【讨论】:
最好的时刻是在viewDidLayoutSubviews 期间,因为它发生在viewDidAppear 之前,所以您仍然可以在视图显示之前进行一些修改。
【讨论】: