gpt4 book ai didi

ios - 使 View 可拖动但不可点击

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:00:37 25 4
gpt4 key购买 nike

我的 View Controller 中有一个标签,我在 viewDidLoad 中这样设置:

var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
label = UILabel()
view.add(label)
label.frame = CGRect(x: 0, y, 0, width: 20, height: 20)
label.text = "A"

let recognizer = UIPanGestureRecognizer(target: self, action: #selector(didDrag(_:))
label.addGestureRecognizer(recognizer)
label.isUserInteractionEnabled = true
}

我希望标签可以拖动,所以我这样实现了didDrag:

@objc func didDrag(_ gesture: UIPanGestureRecognizer) {
let center = label.center
let translation = gesture.translation(in: view)
label.center = CGPoint(x: center.x + translation.x, y: center.y + translation.y)
gesture.setTranslation(.zero, in: view)
}

它工作得很好,我可以拖动我的标签。

但是,如果标签位于我 View 中的某个按钮上方,并且我尝试点击该按钮,则该按钮无法触摸。我试过:

label.isUserInteractionEnabled = false // then I can't also drag around
recognizer.cancelsTouchesInView = false // nothing changes
label.isMultipleTouchEnabled = false // nothing changes

知道如何让标签的平移识别器传递/忽略单击或双击,但仍然能够拖动它吗?

如果这个问题重复,我可以删除它,但我还没有找到任何其他问题完全相同。

编辑

正在关注 Pass taps through a UIPanGestureRecognizer ,目前为止我找到的最接近的问题,我也试过了:

recognizer.delaysTouchesBegan = true
recognizer.maximumNumberOfTouches = 1
recognizer.cancelsTouchesInView = true

但不幸的是,它没有用。

更新该 View 具有各种按钮和文本字段,因此实际上不可能与它们中的每一个进行比较,主要是因为还有包含按钮的堆栈 View ,有时它们存在,有时它们不存在。

最佳答案

经过深思熟虑,我想出了可能可行的解决方案。这个想法是玩触摸事件。每个 View 都有一组方法,例如 touchesBegan()touchesMoved() 等。现在您可以做的是在调用 touchesBegan 时检查触摸的位置正在发生,如果此位置包含在按钮的框架中,请手动调用该函数。

这是伪代码,让您了解概念。未经测试,但根据我的经验,类似的东西应该可以工作

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
touches.forEach { touch in
let touchLocation = touch.location(in: myButton) // that may need to be self instead of myButton
if myButton.frame.contains($0.location) {
//invoke button method here
}
}
}

关于ios - 使 View 可拖动但不可点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53415202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com