Перемещение или привязка пользовательского интерфейса к другой стороне экрана с анимацией

#ios #swift

#iOS #swift

Вопрос:

Я использую плавающий Cocoapod для создания плавающей кнопки действия для моего приложения iOS. Я хотел бы иметь возможность перетаскивать эту кнопку и привязывать ее к другой стороне экрана, если пользователь захочет убрать ее с дороги. Плавающий cocoapod уже поставляется со способом его перетаскивания, и я пытаюсь изменить этот метод, чтобы кнопка с анимацией привязывалась к противоположному углу экрана (в левом нижнем углу). Вот где я до сих пор:

 extension UIView {

func addDragging(){
    
    let panGesture = UIPanGestureRecognizer(target: self, action: #selector(draggedAction(_ :)))
    self.addGestureRecognizer(panGesture)
}

@objc private func draggedAction(_ pan:UIPanGestureRecognizer){
    
    let translation = pan.translation(in: self.superview)
    self.center = CGPoint(x: self.center.x   translation.x, y: self.center.y   translation.y)
    pan.setTranslation(CGPoint.zero, in: self.superview)
    

    // Added the following lines myself - not working

    if let superview = self.superview {
        if self.center.x < superview.frame.size.width / 2 {
            //self.transform = CGAffineTransform( translationX: 50, y: 0.0 )
        }
    }
}
  

}

Код, который я добавил сам, распознает, что кнопка была перемещена в левую часть экрана, но это все, что у меня есть. Мне просто нужно, чтобы он анимировался в нижнем левом углу, когда пользователь перестает перетаскивать кнопку, а затем в другую сторону, если они снова переместят его вправо. Я не уверен, смогу ли я сделать это с ограничениями, поскольку я не использую раскадровки и понятия не имею, как этот cocoapod ограничивает себя. Очень благодарен за любую помощь!

Ответ №1:

Вы можете добиться этого, заменив добавленный код чем-то вроде:

 if let superview = self.superview {
    // Case to move to the left
    if self.center.x < superview.frame.size.width / 2 {
        UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut) {
            self.frame = // Whatever your left frame is
        } completion: { (blockCalledAfterAnimationBool) in
            // A completion handler if you want it
        }
    } else { // Move to the right
        UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut) {
            self.frame = // Whatever your right frame is
        } completion: { (blockCalledAfterAnimationBool) in
            // A completion handler if you want it
        }
    }
}
  

Главное — рекомендуемое использование UIView.animate() функции. Отрегулируйте параметры по мере необходимости, чтобы получить желаемую анимацию.