如何在 Swift 中屏蔽 UIButton?

How to mask a UIButton in Swift?

我有一个复杂的堆栈视图,其中包含许多排列好的标签和按钮。当我试图屏蔽整个堆栈视图以强制执行圆角半径时,堆栈视图中的按钮不再起作用(在内部触摸时未触发动作选择器)。我决定首先将问题简化为一个按钮和一个面具,如下所示:

    let mask = UIView()
    mask.translatesAutoresizingMaskIntoConstraints  = false
    mask.backgroundColor = .green
    mask.layer.cornerRadius = 50
    view.addSubview(mask)
    mask.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    mask.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    mask.widthAnchor.constraint(equalToConstant: 200).isActive = true
    mask.heightAnchor.constraint(equalToConstant: 100).isActive = true
    
    
    
    btn = UIButton()
    btn.backgroundColor = .red
    btn.translatesAutoresizingMaskIntoConstraints  = false
    btn.setTitle("More info", for: .normal)
    btn.tintColor = .black
    btn.addTarget(self, action: #selector(moreInfoTapped), for: .touchUpInside)
    
    
    view.addSubview(btn)
    btn.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    btn.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    btn.widthAnchor.constraint(equalToConstant: 200).isActive = true
    btn.heightAnchor.constraint(equalToConstant: 100).isActive = true
    
    
    view.layoutSubviews()
    view.setNeedsLayout()
    
    btn.mask = mask

这会正确遮盖按钮,但不幸的是遮罩位于按钮前面,因此点击按钮从未注册。

这是视图层次结构:

我是不是漏掉了什么?

如果你指导我,我不知道你为什么要遮罩来实现圆角我可以建议你更好的解决方案..但是对于你当前的情况,如果你关闭遮罩视图的用户交互..你的按钮将开始响应

mask.isUserInteractionEnabled = false

我将使用你在上面指定的按钮示例,因为我不知道你想用堆栈视图做什么。

您可以根据需要使用圆角半径设置 mask 的样式。然后你将 button 添加到遮罩但具有透明背景并使其填充父级即 mask

let maskView = UIView()
view.addSubview(maskView)
maskView.setCornerRadius() // implement this
maskView.setupConstraints() // implement this

let button = UIButton()
button.backgroundColor = .clear
maskView.addSubview(button)
button.fillParent() // implement this

相同的逻辑将适用于堆栈视图。您只需要设置容器视图或遮罩视图的样式。

或者,您可以在容器视图中同时包含按钮和掩码视图:

  • 按钮下方的遮罩
  • 要清除的按钮
  • 容器视图要清晰
  • 设置蒙版视图的样式
  • 让蒙版和按钮都填充容器视图(或根据您的需要调整大小