【问题标题】:Custom Xib With Defined Frame Constraints Is Changing At Runtime具有定义框架约束的自定义 Xib 在运行时发生变化
【发布时间】:2019-05-08 09:50:34
【问题描述】:

我花了几个小时在谷歌搜索和调试器中,我无法弄清楚为什么我在这个 xib 中的父视图在运行时会发生变化。

我已经创建了一个简单的 Xib:

在容器中我设置了宽度和高度约束(我尝试在顶部父级中设置约束,但我似乎无法做到):

在运行时,我以编程方式加载 Xib 并将其添加到视图中。但是在我将它添加到视图并设置位置后,父级的框架更小并且位置错误。

在这里,我明确地将 x 设置为 16,将 y 设置为 400。但是,当我在检查器调试工具中查看它时,我得到的结果与我想要的不同,因为父框架已更改并且容器位置错误因此。我将检查器转到一边,这样您就可以看到父容器(蓝色)和子容器(白色)以及父容器如何小于子容器:

父级(根xib视图'Item Detail Size Widget')的详细信息如下。注意高度现在是 32 而不是 76:

顶级子(Container)的详细信息如下:

所以我为容器设置的约束得到遵守,但父级正在调整大小(我假设因为我无法设置约束,它会使用我设置的框架)。

我尝试关闭和打开 translatesAutoResizingMaskIntoConstraints 和其他一些东西,但我似乎无法让父容器的大小与容器完全相同。

对于为什么根项目详细信息大小小部件与容器的大小不匹配并且在运行时发生变化,您有什么建议吗?

更新

这里是我添加小部件的代码供参考:

    let sizer: ItemDetailSizeWidget = .fromNib() 
    sizer.x = 16
    sizer.y = 400
    contentView.addSubview(sizer)

我有 UIView 扩展设置 x 和 y 如下:

var x: CGFloat {
    set { self.frame = CGRect(x: newValue,
                              y: self.y,
                              width: self.width,
                              height: self.height)
        }
    get { return self.frame.origin.x }
}

var y: CGFloat {
    set { self.frame = CGRect(x: self.x,
                              y: newValue,
                              width: self.width,
                              height: self.height)
        }
    get { return self.frame.origin.y }
}

这里是 fromNib 扩展

class func fromNib<T: UIView>() -> T {
    return Bundle.main.loadNibNamed(String(describing: T.self), owner: nil, options: nil)![0] as! T
}

【问题讨论】:

  • 你能告诉我们加载xib并将顶级视图添加到视图层次结构的代码吗?
  • 这很琐碎,但我现在会添加它

标签: xcode interface-builder xib nslayoutconstraint iboutlet


【解决方案1】:
  • Xcode 总是对 xib 中的顶级视图使用自动调整大小掩码。您可以看到您的第一个屏幕截图:它显示了自动调整大小控件。

  • 您的顶级视图的autoresizingMask 设置为灵活的宽度和高度。

  • 您没有在顶级视图和“容器”子视图之间设置任何宽度或高度限制。

你也有这个代码:

contentView.addSubview(sizer)

我怀疑(因为您提到contentView)您正在将sizer 添加到表视图单元格或集合视图单元格的视图层次结构中。首次创建单元格时,它可能尚未达到最终大小。从collectionView:cellForRowAtIndexPath: 返回后,集合视图(或表格视图)可能会调整单元格的大小。

由于您的sizer 视图在从笔尖加载时将translatesAutoresizingMaskIntoConstraints 设置为true,并且由于它的autoresizingMask[.flexibleWidth, .flexibleHeight],这意味着它会在其父视图增长或缩小时增长或缩小。

要修复,请尝试以下步骤:

  1. 将自动调整大小的掩码更改为:

  2. 将“Item Size Detail Widget”的宽度限制为等于“Container”的宽度,并将高度也限制为相等:

【讨论】:

  • 我认为您正在做一些事情,但只是为了澄清container 只是一个通用的观点。但是你是说我需要在运行时以编程方式设置这些约束吗?因为对于第 2 步,我似乎无法添加宽度和高度约束。我按照您的建议设置了自动调整大小的蒙版,但是当我将Item Size Detail Widget 拖动到自身时,添加宽度或高度约束的弹出窗口不会出现。是否有另一种方法可以显式设置Item Size Detail Widget 上的约束?
  • 您不能将顶级视图的宽度或高度限制为自身。将“Item Size Detail Widget”的宽度和高度限制为“Container”的宽度和高度。
  • 宾果游戏!太感谢了。我正在为此拉头发
猜你喜欢
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 2020-12-09
  • 2012-07-05
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
相关资源
最近更新 更多