如何使 collectionView 的背景视图通过下面的点击

How to make the background view of a collectionView pass taps below

我正在构建一个集合视图。在它下面我放置了一些按钮,如图所示。 我想要的是让 UICollectionView 背景通过下面的点击,这样所需的按钮就可以接收点击。

我不需要将点击手势识别器添加到背景视图(我描述的问题只是这里的一个示例),我需要按钮的动作在点击时直接触发。

我想我可以通过使背景清晰或禁用背景视图的用户交互来做到这一点。虽然为整个集合视图禁用它是有效的,但这种其他方式却行不通。 我怎样才能使我的 collectionView 的背景视图“不可见”,以便点击直接进入下面的按钮而不是进入 collectionview 背景?

以下是我的布局示例。

假设您的 collectionView 和按钮共享同一个超级视图,这应该可以解决问题。

您要做的是绕过 backgroundView 并将点击转发到 collectionView 下面的子视图。

请注意,我们正在选择符合条件的最后一个子视图。那是因为数组中的最后一个子视图最接近用户的手指。

class SiblingAwareCollectionView: UICollectionView {

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {

        let hit = super.hitTest(point, with: event)
        guard hit === backgroundView else {
            return hit
        }

        let sibling = superview?
            .subviews
            .filter { [=10=] !== self }
            .filter { [=10=].canHit }
            .last { [=10=].point(inside: convert(point, to: [=10=]), with: event) }

        return sibling ?? hit
    }
}

如果您查看 hitTest(_:with:) 的文档,它说:

This method ignores view objects that are hidden, that have disabled user interactions, or have an alpha level less than 0.01.

为方便起见,这里有一个扩展以确保我们遵守规则:

extension UIView {
    var canHit: Bool {
        !isHidden && isUserInteractionEnabled && alpha >= 0.01
    }
}