如何使用autolayout获得真正大小的UIView

Chi*_*ken 29 ios autolayout ios-autolayout

我是一名新开发者iOS.

我使用自动布局.

我有个问题.在约束之后,我无法获得UIView的实际大小.

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

self.container.frame.size.height
Run Code Online (Sandbox Code Playgroud)

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

谢谢

All*_*len 46

在"获取实际大小代码"之前,请插入以下代码:

[view setNeedsLayout];
[view layoutIfNeeded];
Run Code Online (Sandbox Code Playgroud)

  • 恕我直言,不需要同时调用`[view setNeedsLayout]`和`[view layoutIfNeeded]`,只有后者对我来说足够了`viewWillLayoutSubviews` (3认同)
  • ** Swift 4答案:**就像@Allen所说的一样,只需在要获取实际尺寸的代码上方插入view.setNeedsLayout()view.layoutIfNeeded()。因为viewDidAppear代码适用于动画之后,这对于某些人来说可能很难看。 (2认同)

Lea*_*ros 18

由于每个人都认为访问是通过a UIViewController而不是在UIView子类内完成的,因此答案并不真正有用.获得正确大小的UIView子类的正确方法是layoutSubviews.


Oxc*_*cug 16

最简单的解决方案是运行该代码-viewDidAppear:(在autolayout运行之后).


Sam*_*Sol 7

这太棒了.

如果您想在自动布局使用期间不使用layoutsubviews方法获取帧,请使用以下方法:

dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"View frame: %@", NSStringFromCGRect(view.frame));
    })
Run Code Online (Sandbox Code Playgroud)


Pie*_*rre 7

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

返回值
满足其约束的视图的大小。

讨论
确定所有视图及其子视图的约束来确定视图的最佳大小。

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