ios - 在 Swift 中单击按钮而不释放触摸
问题描述
我连续有 5 个按钮:
我试图检测用户对所有按钮的触摸而不释放他的触摸 - 就像触摸钢琴一样。
到目前为止,我试过这个:
func buildButtons() {
button.addTarget(self, action: #selector(buttonAction), for: .touchDown)
view.addSubview(button)
}
@objc func buttonAction(sender: UIButton) {
sender.isEnabled = false
sender.isEnabled = true
print(sender.tag)
}
但是我得到的是一个被触摸的按钮,然后当我触摸下一个按钮时,没有释放,没有任何作用。
有什么建议么?
解决方案
我不确定究竟是什么不适合你,我已经实现了一个简单的测试项目,并且我在不释放第一个按钮的情况下按下下一个按钮。这是我写的代码
override func viewDidLoad() {
super.viewDidLoad()
let stackView = UIStackView(frame: CGRect(origin: CGPoint(x: 40.0, y: 40.0), size: CGSize(width: 300, height: 45)))
stackView.axis = .horizontal
stackView.distribution = .fillEqually
stackView.spacing = 10
let button1 = UIButton(frame: CGRect(origin: .zero, size: CGSize(width: 45, height: 45)))
let button2 = UIButton(frame: CGRect(origin: .zero, size: CGSize(width: 45, height: 45)))
let button3 = UIButton(frame: CGRect(origin: .zero, size: CGSize(width: 45, height: 45)))
[button1, button2, button3].forEach { button in
button.backgroundColor = .blue
stackView.addArrangedSubview(button)
button.addTarget(self, action: #selector(touchDownAction), for: .touchDown)
}
view.addSubview(stackView)
}
@objc func touchDownAction() {
print("touched button")
}
此代码在运行 ios 11.4 的 iphone 上进行了测试。你能提供一些额外的信息吗?
编辑:我已经更新了解决方案,以便在将手指从一个按钮拖动到下一个按钮时它可以工作,对不起我的误解。希望这对你有用。另外请记住,现在您将遇到另一个问题,当您的手指在按钮内时,您的触摸动作将被连续调用。
var button1: UIButton!
var button2: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
let stackView = UIStackView(frame: CGRect(origin: CGPoint(x: 40.0, y: 40.0), size: CGSize(width: 300, height: 45)))
stackView.axis = .horizontal
stackView.distribution = .fillEqually
stackView.spacing = 10
button1 = UIButton(frame: CGRect(origin: .zero, size: CGSize(width: 45, height: 45)))
button2 = UIButton(frame: CGRect(origin: .zero, size: CGSize(width: 45, height: 45)))
[button1, button2].forEach { button in
button!.backgroundColor = .blue
stackView.addArrangedSubview(button!)
}
view.addSubview(stackView)
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let touchLocation = touches.first!.location(in: view)
let button1FrameInMainView = button1.convert(button1.bounds, to: view)
let button2FrameInMainView = button2.convert(button2.bounds, to: view)
if button1FrameInMainView.contains(touchLocation) {
print("touch inside button 1")
}
if button2FrameInMainView.contains(touchLocation) {
print("touch inside button 2")
}
}
推荐阅读
- php - 在 Woocommerce 电子邮件通知中将产品名称替换为 SKU
- javascript - 有没有办法从 StackEdits 工具栏中删除 StackEdit 按钮?
- regex - 在 Go 正则表达式中拆分浮点字符串
- python - 如何在第 1 类中更改第 2 类(Tkinter)中的小部件(标签)的属性?
- python - objects.filter by User 只为一个用户过滤数据
- ios - 为什么安装 Stripe pod 并在代码目标 c 中使用 Stripe 后出现 pod 错误?
- android - 关闭 DialogFragment 后面的点击活动?
- swift - 加入 Fluent in Vapor 时崩溃
- c++ - 具有相同成员的父类和子类的大小
- reactjs - 替换对象中的值