【问题标题】:Auto layout only returning single device width. Expecting device that is being used width自动布局仅返回单个设备宽度。预期正在使用的设备宽度
【发布时间】:2017-03-19 01:53:44
【问题描述】:

我正在尝试设置我的 UIImageView 角半径以​​生成圆形 UIImageView。但是,当我在 iPhone 7 Plus 上运行我的应用程序时,图像不是安静的圆形。

    imageOutlet.layer.cornerRadius = imageOutlet.frame.size.width / 2

在调试此问题时,我注意到无论设备如何,返回的宽度都是相同的。然后,当我将情节提要底部附近的“视图为:iPhone 7 (w C, h R)”更改为 iPhone 7 Plus 时,在 iPhone 7 Plus 上一切正常,在 iPhone 7 上无法正常工作。

我对 UIImageView 使用的约束如下:

我的目的是能够在正在使用的设备上获得 UIImageView 的宽度。

【问题讨论】:

    标签: xcode swift3 autolayout


    【解决方案1】:

    UIImageView 上添加宽度/高度约束以强制它们相等。如果图像的宽度/高度取决于屏幕尺寸,您将得到如您所描述的奇怪结果。由于您对 Superview 有 42 像素的尾随/前导约束,因此图像的宽度将因设备而异。您使用的公式仅适用于相等的宽度/高度。

    【讨论】:

    • 如果有宽度/高度限制,UIImageView 将是一个固定大小,与设备无关。我的意图是让UIImageView 扩展到每个设备。因此,使用 42 个尾随/前导,我在两端都有一个适当的缓冲区,并且以 1:1 的比例限制了高度。
    • 确保在计算框架尺寸后设置圆角半径。这是我唯一的另一个想法。
    【解决方案2】:

    在为这个问题苦苦挣扎了一段时间后,我终于找到了解决方案。

    总结:在调用.frame.size.width 之前在我的UIImageView 插座上调用layoutIfNeeded() 会为运行应用程序的设备生成正确的宽度。

    详情: 我的setAppearance() 函数在viewDidLoad() 函数中被调用。在viewDidLoad() 调用期间,应用程序返回了一个基于默认设备的宽度(在我的例子中:iPhone 7)。即使我在 iPhone 7 Plus 模拟器上运行时也会发生这种情况。但是,在 viewDidLoad() 之后随时调用 width 会根据运行应用程序的设备产生正确的宽度。

    下面,我在 iPhone 7s Plus 上运行应用程序并在 viewDidLoad 函数期间打印宽度。在viewDidLoad() fn 之后再次调用时,宽度从 281.0(iPhone 7 预期尺寸)变为 310.6667(iPhone 7 Plus 预期尺寸)。

    这导致不满意,因为我的图像不完全是圆形的(我的意图是使用 .frame.size.width/2 调用)。

    但是,在访问UIImageViewwidth 成员之前调用layoutIfNeeded() fn 会在viewDidLoad() fn 期间产生以下宽度。

    通过在控制宽度之前强制UIImageViewlayoutIfNeeded() 的布局,应用程序在viewDidLoad 函数期间根据设备接收正确的宽度。 访问https://developer.apple.com/reference/uikit/uiview/1622507-layoutifneeded了解更多信息。

    【讨论】:

      猜你喜欢
      • 2017-02-08
      • 2017-01-27
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      相关资源
      最近更新 更多