在 Swift 中剪辑到父视图的子视图

Subview that clips to parent view in Swift

我正在尝试添加一个始终与其父视图具有相同大小的子视图,以便在父视图更改时始终调整大小。

我正在考虑从代码中添加(顶部、底部、前导、尾随)约束。

当我添加子视图时,将执行此代码:

subview.frame = parent.frame
subview.translatesAutoresizingMaskIntoConstraints = false
subview.leadingAnchor.constraint(equalTo: parent.leadingAnchor).isActive = true
subview.trailingAnchor.constraint(equalTo: parent.trailingAnchor).isActive = true
subview.topAnchor.constraint(equalTo: parent.topAnchor).isActive = true
subview.bottomAnchor.constraint(equalTo: parent.bottomAnchor).isActive = true

但是子视图大小一直为0,并且显示在屏幕的左上角。 我不明白为什么它的大小是零,因为我设置了它的框架,也因为它有所有限制来设置它的大小。

检查器视图:

注意:父视图在左边,子视图(LoaderView)在右边

您的父视图似乎是一个滚动视图,它缺少告诉它可滚动内容大小的约束(请注意第一个屏幕截图中的警告)。由于没有定义内容大小,因此可滚动区域大小仅为零。

我不确定你需要什么约束,因为这取决于你的具体情况,但为了至少看到你的子视图,你可以添加(例如)等宽和等高约束您的子视图及其父视图(滚动视图):

NSLayoutConstraint.activate([
    subview.widthAnchor.constraint(equalTo: parent.widthAnchor),
    subview.heightAnchor.constraint(equalTo: parent.heightAnchor)
])

这将可滚动区域定义为在宽度和高度上与滚动视图的框架相等。但是,如果您这样做,那么当您尝试滚动到可滚动区域之外时(如果此滚动视图已启用),除了弹跳行为外,实际上不会有任何类型的滚动。

您可以改为将高度锚点更改为等于某个常量,以允许进行一些实际滚动:

NSLayoutConstraint.activate([
    subview.widthAnchor.constraint(equalTo: parent.widthAnchor),
    subview.heightAnchor.constraint(equalToConstant: 2000) // just some arbitrary amount for demonstration purposes
])

这使得可滚动高度等于 2000 点,而不管滚动视图框架的高度如何。

或者,如果您希望可滚动区域是滚动视图框架高度的某个倍数,您可以在高度锚点上设置乘数:

NSLayoutConstraint.activate([
    subview.widthAnchor.constraint(equalTo: parent.widthAnchor),
    subview.heightAnchor.constraint(equalTo: parent.heightAnchor, multiplier: 3)
])

这使得可滚动高度等于滚动视图框架高度的三倍。

如果您想要水平滚动的滚动视图,只需更改 widthAnchor 而不是我上面所做的 heightAnchor。或者,如果您想要一个可让您在垂直和水平方向上平移的 2D 可滚动区域,则同时更改两者。