【问题标题】:How to make the background view of a collectionView pass taps below如何使collectionView的背景视图通过点击下面
【发布时间】:2021-12-25 17:32:44
【问题描述】:

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

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

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

以下是我的布局示例。

【问题讨论】:

    标签: ios swift uicollectionview uigesturerecognizer


    【解决方案1】:

    假设您的 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 { $0 !== self }
                .filter { $0.canHit }
                .last { $0.point(inside: convert(point, to: $0), with: event) }
    
            return sibling ?? hit
        }
    }
    

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

    此方法会忽略隐藏、禁用用户交互或 alpha 级别小于 0.01 的视图对象。

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

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

    【讨论】:

    • 好的,我创建了一个集合视图并将其放在另一个视图下方,因此两个视图都是集合视图。他们都应该是 SiblingAwareCollectionView 吗?因为我尝试将它们都设为 SiblingAwareCollectionView 但没有奏效。我尝试了很多东西,但水龙头仍然没有通过
    • @crost 你为什么使用两个collectionViews?我以为你有一个带有一些按钮和一个 collectionView 的父视图。如果我理解正确,那一个collectionView 也将backgroundView 属性初始化为普通视图。我不确定您要完成什么。
    • 别担心,这个答案让我看到了另一种解决方案,非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多