Swift: 我可以让下拉菜单保持可点击状态吗

Swift: can I make drop down menu stay clickable

我在我的项目中使用位于表视图内的下拉菜单。到目前为止,我已经能够通过使其单元格 zPosistion 高于其他单元格来使其正确溢出

cell.layer.zPosition = 3

并使用以下代码使其可点击

override func hitTest(_ point: CGPoint, with e: UIEvent?) -> UIView? {
    if let result = super.hitTest(point, with:e) {
        return result
    }
    for sub in self.subviews.reversed() {
        let pt = self.convert(point, to:sub)
        if let result = sub.hitTest(pt, with:e) {
            return result
        }
    }
    return nil
}

一切正常,但是当我开始在表格视图中滚动时,最后一部分(使下拉菜单可点击的部分)停止工作,当您尝试点击溢出的下拉部分时,点击直接进入下面的单元格。有谁知道解决这个问题的方法?我知道我制作此下拉列表的方式不是最佳的,但我真的很想让它发挥作用。这是我项目的一部分 link,您可以在其中看到实际问题

https://github.com/Rawchris/Drop-down-overflow3

希望对您有所帮助!

您正在 table 展开时 "spills out" 的视图单元格中提出一个视图。这是有问题的,因为它对框架不利。这种味道必须一直向下到命中测试或覆盖 didMoveToSuperview。我不知道我怎么能让它以这种方式工作。即使可以,我也不会推荐它。 UIKit 中有很多内置行为,违背框架几乎不是一个好主意:横向方向呢?尺码类?动态文本?在一个版本中有效的功能在另一个版本中很容易被破坏。

相反,我提出了一个基于常见系统元素的解决方案:自动布局和视图层次结构。

看看这个方案:

左边是你原来的方法。检查视图层次结构时,可以看到视图嵌套在 table 视图单元格中。当 "spilling over" 单元格时,我们将不受系统支持,因为 table 视图中的所有内容都是围绕单元格及其定义的大小组织的。这导致扩展按钮在单元格边界之外无法交互的问题。

右边是我的建议。在视图控制器中,我已经在 table 视图的同一级别解除了按钮。现在,当展开按钮时,所有选项都有效。然后为了创建按钮固定到单元格的错觉,我只是动态修改顶部约束,由滚动视图偏移通知(table视图毕竟是滚动视图)。

这当然有影响。如果您想使用所选选项影响单元格,通常需要使用新配置(或至少是受影响的单元格)重新加载 table 视图。如果您想在多个单元格上保留多个按钮,那么计算约束会变得很棘手(尽管可以通过 tableviewDelegate 知道单元格高度来完成)。如果你想添加一个导航栏,那么偏移量将需要一些调整。总而言之,我们正在考虑一个非标准的 UI 元素,需要一些自定义工作才能使其看起来正确,因此需要付出一些努力。无论如何,我建议将解决方案基于 UIKit 中的标准解决方案。