iOS:如何实现遮罩视图事件穿透?

Posted

技术标签:

【中文标题】iOS:如何实现遮罩视图事件穿透?【英文标题】:iOS: How to implement the mask view event penetrate? 【发布时间】:2019-08-27 06:42:12 【问题描述】:

如下图,我有一个collectionView,上面有一个maskView。 以及 maskView 上方的右侧视图。

如何实现遮罩视图事件穿透?

我的 PM 的想法是,当 collectionView 上方的掩码视图时,collectionViewCell 是可点击的。 (有点奇怪)

掩码视图已经接管了collectionView的事件。

我认为我应该覆盖事件响应者链。

我试图处理override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView?

class Mask: UIView 
// ...
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? 
        guard let views = superview?.subviews else 
            return self
        
        for view in views
            if type(of: view) == UICollectionView.self
                return view
            
        
        return self
    

没有按命令工作,collectionView 只是滚动。

如何解决?


我稍微改进了代码。

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? 
        guard let views = superview?.subviews else 
            return self
        
        for view in views
            if type(of: view) == UICollectionView.self
                let collectionView = view as! UICollectionView
                for cell in collectionView.visibleCells
                    if cell.frame.contains(point)
                        return cell
                    
                
            
        
        return self
    

它不是很锋利。切换单击的单元格时会放弃某些事件。就像 Apple 做了一个 hitTest 事件缓存。

【问题讨论】:

【参考方案1】:

如果我理解正确并且掩码视图位于 collectionView 之上并且它获取事件,您可以将掩码视图 userInteractionEnabled 设置为 false。

这样事件将被发送到下面的层,直到有人处理它。

【讨论】:

以上是关于iOS:如何实现遮罩视图事件穿透?的主要内容,如果未能解决你的问题,请参考以下文章

Unity之引导功能遮罩事件穿透

Unity之引导功能遮罩事件穿透

Unity之引导功能遮罩事件穿透

JS中事件穿透深度剖析与多种解决方案

iOS点击事件穿透以及扩大视图的响应区域

1.解决小程序遮罩层遮住页面后滚动穿透问题