如何在 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
相同的逻辑将适用于堆栈视图。您只需要设置容器视图或遮罩视图的样式。
或者,您可以在容器视图中同时包含按钮和掩码视图:
- 按钮下方的遮罩
- 要清除的按钮
- 容器视图要清晰
- 设置蒙版视图的样式
- 让蒙版和按钮都填充容器视图(或根据您的需要调整大小
我有一个复杂的堆栈视图,其中包含许多排列好的标签和按钮。当我试图屏蔽整个堆栈视图以强制执行圆角半径时,堆栈视图中的按钮不再起作用(在内部触摸时未触发动作选择器)。我决定首先将问题简化为一个按钮和一个面具,如下所示:
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
相同的逻辑将适用于堆栈视图。您只需要设置容器视图或遮罩视图的样式。
或者,您可以在容器视图中同时包含按钮和掩码视图:
- 按钮下方的遮罩
- 要清除的按钮
- 容器视图要清晰
- 设置蒙版视图的样式
- 让蒙版和按钮都填充容器视图(或根据您的需要调整大小