UIControlEventTouchDragExit
是
“将手指从控件内拖到其边界外的事件”UIControlEventTouchDragEnter
是
“将手指拖入控件边界的事件”
如果我模拟一个恒定的向下拖动,本质上是退出控件边界一次,为什么touchDragExit
和touchDragEnter
会被调用多次?
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let btn = CustomButton(frame: CGRect(x: 100, y: 100, width: 100, height: 100), image:UIImage())
btn.setTitle("", for: .normal)
btn.backgroundColor = UIColor.green
self.view.addSubview(btn)
}
}
class CustomButton: UIButton {
init(frame: CGRect, image:UIImage?) {
super.init(frame: frame)
self.addTargets()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
private func addTargets() {
self.addTarget(self, action: #selector(self.touchDown), for: UIControlEvents.touchDown)
self.addTarget(self, action: #selector(self.touchUpInside), for: UIControlEvents.touchUpInside)
self.addTarget(self, action: #selector(self.touchDragExit), for: UIControlEvents.touchDragExit)
self.addTarget(self, action: #selector(self.touchDragEnter), for: UIControlEvents.touchDragEnter)
self.addTarget(self, action: #selector(self.touchCancel), for: UIControlEvents.touchCancel)
}
func touchDown() {
print("touched down")
UIView.animate(withDuration: 0.05, animations: {
self.transform = CGAffineTransform(scaleX: 0.9, y: 0.9)
},completion: nil)
}
func touchUpInside() {
print("touch up inside")
UIView.animate(withDuration: 0.7, delay: 0.0, usingSpringWithDamping: 0.2, initialSpringVelocity: 9.0, options: [.curveEaseInOut, .allowUserInteraction], animations: {
self.transform = CGAffineTransform.identity
}, completion: nil)
}
func touchDragExit() {
print("touch drag exit")
UIView.animate(withDuration: 0.7, delay: 0.0, usingSpringWithDamping: 1.0, initialSpringVelocity: 0.0, options: [.curveEaseInOut], animations: {
self.transform = CGAffineTransform.identity
}, completion: nil)
}
func touchDragEnter() {
print("touch drag enter")
UIView.animate(withDuration: 0.05, animations: {
self.transform = CGAffineTransform(scaleX: 0.9, y: 0.9)
},completion: nil)
}
func touchCancel() {
print("touch canceled")
UIView.animate(withDuration: 0.05) {
self.transform = CGAffineTransform.identity
}
}
}
2条答案
按热度按时间fxnxkyjh1#
考虑手指末端的大小与像素大小的比较(特别是在视网膜显示器上)。这种相对差异有很大的误差空间。操作系统必须进行一些估计,以准确地计算出你的手指在屏幕上“指向”的位置,而当你摆动手指时,这种估计可能会略有变化。因此,弄清楚你的手指是在一个像素边界的内部还是外部可能会有点坚韧,一些波动是合理的。
6jygbczu2#
这是按比例
self.transform = CGAffineTransform(scaleX: 0.9, y: 0.9)
改变视图框的bcz例如,尝试改变背景颜色而不是比例,它就可以了