我是 iOS 的新开发者。
我使用自动布局。
我有个问题。约束后我无法获得 UIView 的实际大小。
例如,当我想获得UIView
有约束的大小时
self.container.frame.size.height
对于所有设备大小,它总是返回 550。但是当我在不同的设备上运行它时,我可以看到它有不同的大小。
谢谢
我是 iOS 的新开发者。
我使用自动布局。
我有个问题。约束后我无法获得 UIView 的实际大小。
例如,当我想获得UIView
有约束的大小时
self.container.frame.size.height
对于所有设备大小,它总是返回 550。但是当我在不同的设备上运行它时,我可以看到它有不同的大小。
谢谢
在“获取实际尺寸代码”之前,插入以下代码:
[view setNeedsLayout];
[view layoutIfNeeded];
由于每个人都假设访问是通过 aUIViewController
而不是在UIView
子类中完成的,因此答案并没有证明真的有用。获得正确大小的UIView
子类的正确方法是在layoutSubviews
.
最简单的解决方案是只运行该代码-viewDidAppear:
(在运行自动布局之后)。
似乎- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize;
是您正在寻找的东西:
返回值
满足它所持有的约束的视图的大小。讨论
确定视图的最佳尺寸,考虑它所拥有的所有约束及其子视图的约束。
你可以只使用该UIView
方法intrinsicContentSize
这太棒了。
如果您想在使用自动布局期间不使用 layoutsubviews 方法获取框架,请使用此:
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"View frame: %@", NSStringFromCGRect(view.frame));
})
[查看 layoutIfNeed] 救救我。
使用此方法在绘制之前强制子视图的布局。使用接收消息的视图作为根视图,该方法从根开始布局视图子树。
调用此方法后,我可以在 xib 中获取自定义视图的实际大小。非常感谢@Allen 和作者。
最好的时刻是在 期间,viewDidLayoutSubviews
因为它发生在之前,viewDidAppear
所以您仍然可以在视图显示之前进行一些修改。