【问题标题】:How to get real size UIView with autolayout如何使用自动布局获得真实大小的 UIView
【发布时间】:2014-12-26 05:45:36
【问题描述】:

我是一名 iOS 新开发者。

我使用自动布局。

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

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

self.container.frame.size.height

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

谢谢

【问题讨论】:

    标签: ios autolayout ios-autolayout


    【解决方案1】:

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

    [view setNeedsLayout];
    [view layoutIfNeeded];
    

    【讨论】:

    • 恕我直言,无需同时调用[view setNeedsLayout][view layoutIfNeeded]viewWillLayoutSubviews 对我来说只有后者就足够了
    • Swift 4 答案:正如@Allen 所说的那样,只需将 view.setNeedsLayout() view.layoutIfNeeded() 插入到您试图获得真实尺寸的代码上方你正在使用的东西。因为 viewDidAppear 代码在动画之后应用,这对某些人来说可能看起来很丑。
    【解决方案2】:

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

    【讨论】:

    • 我在 layoutSubviews 中计算尺寸。但它只有在我在高度计算之前调用 layoutIfNeeded 时才有效。调用 self.setNeedsLayout,也可以。我知道哪一个最好?
    【解决方案3】:

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

    【讨论】:

    • 谢谢。但是,如果我想在 viewDidLoad 中获得真实尺寸怎么办。你有解决办法吗?
    • @Chicken 查看艾伦的解决方案。这将强制自动布局立即运行。你真的应该避免做这种事情,尤其是不止一次。
    【解决方案4】:

    好像- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize; 就是你要找的东西:

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

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

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

    【讨论】:

      【解决方案5】:

      【讨论】:

      • 这应该是正确的答案。如果您以编程方式进行自动布局而不是显式设置框架,那么这是根据内容获取高度/重量的正确方法。
      • @Marquis103 intrinsicContentSize 忽略(顾名思义,并且在上面的屏幕截图中也提到)所有影响视图的约束。例如,标签的固有内容大小就是显示标签文本所需的框架。但是,如果您的标签具有“宽度
      【解决方案6】:

      这太棒了。

      如果你想在 autolayout 使用过程中不使用 layoutsubviews 方法获取框架,使用这个:

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

      【讨论】:

      • 感谢您提出这个想法。这里没有什么奇怪的:您要求在返回主调度队列后调用此代码。这将在自动布局发生后发生。确实很有用!
      • 谢谢。 Sam 说的并不奇怪。这也是一个比子类视图更好的解决方案。
      【解决方案7】:

      [查看 layoutIfNeed] 救救我。

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

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

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-20
          • 2013-07-27
          • 2015-04-12
          • 1970-01-01
          • 2014-09-08
          • 2013-05-14
          • 1970-01-01
          相关资源
          最近更新 更多