У меня есть UIView, который я могу перетаскивать по оси Y, который фиксируется в 1 из 2 позиций.Проблема в том, что мне нужно перетащить его через определенную точку на оси Y, чтобы он встал на место.Это кажется неуклюжим, когда вы пытаетесь быстро провести пальцем, но не проходите мимо этой конкретной оси Y, и он возвращается в исходное положение.
Моя желаемая цель - сделать так, чтобы он защелкнулся на 1 из 2 позиций в зависимости отнаправление, по которому пользователь проводил, когда он выпустил UIView.
@objc func panGesture(recognizer: UIPanGestureRecognizer) {
let window = UIApplication.shared.keyWindow
let translation = recognizer.translation(in: self)
let currentY = self.frame.minY
let partialY = (window?.frame.height)!-194
let halfWayPoint = ((window?.frame.height)!/2)-40
self.frame = CGRect(x: 0, y: currentY + translation.y, width: self.frame.width, height: self.frame.height)
recognizer.setTranslation(CGPoint.zero, in: self)
switch recognizer.state {
case .changed:
// Prevent scrolling up past y:0
if currentY <= 0
{
self.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height)
}
case .ended:
// Snap to 80 (y) (expanded)
if currentY < 80 || currentY > 80 && currentY < halfWayPoint
{
UIView.animate(withDuration:0.62, delay: 0.0, usingSpringWithDamping: 0.62, initialSpringVelocity: 0.5, options: .curveEaseInOut, animations:
{
recognizer.view!.frame = CGRect(x: 0, y: 80, width: self.frame.width, height: self.frame.height)
}, completion: { (true) in
self.isExpanded = true
})
}
// Snap back to partial (y) (original position)
if currentY > partialY || currentY < partialY && currentY > halfWayPoint
{
UIView.animate(withDuration:0.62, delay: 0.0, usingSpringWithDamping: 0.62, initialSpringVelocity: 0.5, options: .curveEaseInOut, animations:
{
recognizer.view!.frame = CGRect(x: 0, y: partialY, width: self.frame.width, height: self.frame.height)
}, completion: {(true) in
self.isExpanded = false
})
}
default:
print("Default")
}
Как вы можете видеть, halfWayPoint - это точка, в которой представление должно быть над или под ним, чтобы определить положение, в которое оно привязывается.Это неэффективно, и я хотел бы сделать это в зависимости от направления (вверх или вниз), когда пользователь перетаскивает вид.