【问题标题】:How to mask a UIButton in Swift?如何在 Swift 中屏蔽 UIButton?
【发布时间】:2023-03-17 23:16:02
【问题描述】:

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

    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

这会正确屏蔽按钮,但不幸的是,屏蔽被放置在按钮前面,因此按钮上的点击从未注册。

这是视图层次结构:

我错过了什么吗?

【问题讨论】:

  • 我不知道您想要实现什么先生...但一种解决方法是关闭用户交互以屏蔽视图..其他选项是不要将屏蔽视图添加到您的视图...

标签: ios swift uibutton calayer uibezierpath


【解决方案1】:

我将使用您在上面指定的按钮示例,因为我不知道您想对 stackview 做什么。

您可以根据需要使用圆角半径设置 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

同样的逻辑也适用于 stackview。您只需要设置容器视图或遮罩视图的样式。

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

  • 按钮下方的掩码
  • 要清除的按钮
  • 要清晰的容器视图
  • 样式化遮罩视图
  • 让遮罩和按钮都填充容器视图(或调整它们的大小以最适合您的方式

【讨论】:

    【解决方案2】:

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

    mask.isUserInteractionEnabled = false
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 2011-06-01
    • 1970-01-01
    相关资源
    最近更新 更多