40

我是 iOS 的新开发者。

我使用自动布局。

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

例如,当我想获得UIView有约束的大小时

self.container.frame.size.height

对于所有设备大小,它总是返回 550。但是当我在不同的设备上运行它时,我可以看到它有不同的大小。

谢谢

4

8 回答 8

54

在“获取实际尺寸代码”之前,插入以下代码:

[view setNeedsLayout];
[view layoutIfNeeded];
于 2015-04-07T03:52:43.387 回答
22

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

于 2015-07-06T14:28:23.950 回答
16

最简单的解决方案是只运行该代码-viewDidAppear:(在运行自动布局之后)。

于 2014-12-26T05:48:37.133 回答
14

似乎- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize;是您正在寻找的东西:

返回值
满足它所持有的约束的视图的大小。

讨论
确定视图的最佳尺寸,考虑它所拥有的所有约束及其子视图的约束。

https://developer.apple.com/documentation/uikit/uiview/1622624-systemlayoutsizefittingsize?language=objc

于 2017-11-02T17:36:23.767 回答
13

你可以只使用该UIView方法intrinsicContentSize

在此处输入图像描述

您可以阅读有关https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instm/UIView/intrinsicContentSize

于 2014-12-26T13:37:11.480 回答
8

这太棒了。

如果您想在使用自动布局期间不使用 layoutsubviews 方法获取框架,请使用此:

dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"View frame: %@", NSStringFromCGRect(view.frame));
    })
于 2015-12-29T13:06:37.193 回答
3

[查看 layoutIfNeed] 救救我。

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

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

于 2015-10-06T03:03:44.893 回答
1

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

于 2014-12-26T13:31:34.650 回答