【问题标题】:Frame size of UICollectionView is bigger than size of UIScreenUICollectionView 的帧大小大于 UIScreen 的大小
【发布时间】:2019-09-04 04:11:30
【问题描述】:

在我的UIViewControllerviewDidLoad 函数中,我调用了

print("\(UIScreen.main.bounds.size.width) \(collectionView.frame.width)")

它会打印出来

320.0 375.0

这怎么可能? UICollectionView 应该是一样的宽度,mb 更小但绝对不会更大

情节提要中此视图的设置:

每个约束设置为

所以我在 iPhone SE 模拟器上对其进行了测试,但在 Storyboard 中我使用的是 iPhone 8。

但我相信,当我使用自动布局(使我的视图大小与安全区域的大小匹配的约束)时,这根本不重要

iPhone 8 宽度为 375 点,iPhone SE 为 320:

更新

似乎viewDidLoad 在情节提要中返回了您最后选择的设备的大小(非常丑陋)

因此,要获得有关视图的正确数据,我必须在 viewDidAppear 中获取大小

在 Android 中,如果某些视图的大小尚不可用(视图尚未膨胀),则它只会返回零(宽度 == 0,高度 == 0),但在 iOS 中,您可以从 Xcode 获得宽度和高度运行时的情节提要...真的吗?

【问题讨论】:

    标签: ios uiview autolayout constraints frame


    【解决方案1】:

    当您从情节提要实例化视图控制器时,其视图的大小将是情节提要上当前设置的大小。将其添加到视图层次结构后,它将具有与屏幕相同的大小。 viewDidLoad 在添加视图之前调用,因此它的大小仍与故事板上的大小相同。您可以在内部方法viewWillApearviewDidAppearviewDidLayout 中获取它显示的大小。请记住,这些方法可能会被多次调用。

    【讨论】:

    • 是的.. 已经发现了。最好像在 Android 中那样返回零,因为许多开发人员会认为 viewDidLoad 中的大小是正确的,所以它的设计非常糟糕。在 Android 中,如果某些视图的大小尚不可用(视图尚未膨胀),那么它只会返回零(宽度 == 0,高度 == 0),但在 iOS 中,您会从最后选择的设备中获取宽度和高度Xcode Storyboard 在运行时(在 viewDidLoad 函数中)...
    • 我认为如果您不使用 Autolayout 并且只希望您的视图具有与您在情节提要中设置的大小相同的大小,那可能会出现问题。我认为情节提要和笔尖实际上只是供NSCoding 实现UIKit 类使用的档案。因此,当您从故事板实例化对象时,您在其上设置的任何属性都会反映出来,这是有道理的。
    • 好吧.. 如果对视图使用约束,它们可以设置为零,如果不使用约束,它们可以设置零(当它们在 viewDidLoad、viewWillApear、viewDidAppear 和 viewDidLayout 中相同时)跨度>
    猜你喜欢
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多