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

Xcode 具有已定义框架约束的自定义Xib在运行时发生更改,xcode,interface-builder,xib,nslayoutconstraint,iboutlet,Xcode,Interface Builder,Xib,Nslayoutconstraint,Iboutlet,我已经花了几个小时在调试器中搜索和调试,我不明白为什么我在这个xib中的父视图在运行时会发生变化 我创建了一个简单的Xib: 在容器中,我设置了宽度和高度约束,我尝试在顶部父对象中设置约束,但似乎无法: 在运行时,我以编程方式加载Xib,并将其添加到视图中。但是,在我将其添加到视图并设置位置后,父对象的帧变小,并且位置错误 这里我显式地将x设置为16,y设置为400。但是,当我在inspector调试工具中查看它时,我得到的结果与我想要的不同,因为父帧已更改,因此容器位置错误。我将检查器转向一侧

我已经花了几个小时在调试器中搜索和调试,我不明白为什么我在这个xib中的父视图在运行时会发生变化

我创建了一个简单的Xib:

在容器中,我设置了宽度和高度约束,我尝试在顶部父对象中设置约束,但似乎无法:

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

这里我显式地将x设置为16,y设置为400。但是,当我在inspector调试工具中查看它时,我得到的结果与我想要的不同,因为父帧已更改,因此容器位置错误。我将检查器转向一侧,以便您可以看到蓝色的父容器和白色的子容器,以及父容器如何比子容器小:

根xib视图“项目详细信息大小小部件”的父级详细信息如下所示。请注意,高度现在是32而不是76:

顶级子容器的详细信息如下所示:

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 }
}
因此,我为容器设置的约束得到了尊重,但父容器正在调整大小,因为我无法设置约束,所以它将使用我设置的框架

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

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

更新

以下是我添加小部件的代码供参考:

    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
}
Xcode始终为xib中的顶级视图使用自动调整大小掩码。您可以看到您的第一个屏幕截图:它显示了自动调整大小控件

顶层视图的autoresizingMask设置为灵活的宽度和高度

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

您还有以下代码:

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

由于sizer视图在从nib加载时已将TranslatesAutoResizengMaskinToConstraints设置为true,且其AutoResizengMask为[.flexibleWidth、.flexibleHeight],这意味着它将在superview增大或缩小时增大或缩小

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

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

将“项目大小详细信息小部件”的宽度限制为等于“容器”的宽度,并将高度限制为等于:


你能给我们看一下加载xib并将顶层视图添加到视图层次结构的代码吗?这很简单,但我现在要添加它。我想你已经了解了一些东西,但只是为了澄清容器只是一个通用视图。但你是说我需要在运行时通过编程设置这些约束?因为对于步骤2,我似乎无法添加宽度和高度约束。我按照您的建议设置了自动调整大小的遮罩,但是当我控制将Item Size Detail小部件拖动到自身上时,添加宽度或高度约束的弹出窗口不会出现。是否有其他方法可以显式设置Item Size Detail小部件上的约束?您不能将顶级视图的宽度或高度约束为自身。将“项目大小细节小部件”的宽度和高度限制为“容器”的宽度和高度。宾果!非常感谢你。这件事让我毛骨悚然