具有定义的框架约束的自定义Xib在运行时更改

时间:2018-12-06 16:33:02

标签: xcode interface-builder xib nslayoutconstraint iboutlet

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

我创建了一个简单的Xib:

enter image description here

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

enter image description here

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

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

enter image description here

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

enter image description here

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

enter image description here

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

我尝试关闭然后打开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
}

1 个答案:

答案 0 :(得分:1)

  • Xcode始终对xib中的顶级视图使用自动调整大小掩码。您可以看到您的第一个屏幕快照:它显示了自动调整大小的控件。

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

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

您还具有以下代码:

contentView.addSubview(sizer)

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

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

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

  1. 将自动调整大小蒙版更改为此:

    autoresizing mask

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

    constraints