Swift не может анимировать элемент кнопки панели навигации - PullRequest
0 голосов
/ 12 октября 2019

Мне нужна помощь, чтобы перевести rightBarButtonItem в UINavigationBar. Я проследил за этим , а также нашел похожие вопросы, которые побудили меня добавить кнопку как customView из UIBarButtonItem, однако код все еще не работает.

Я создалUIBarButtonItem и установите UIButton в качестве пользовательского представления.

let button: UIButton = {
    let b = UIButton(type: .system)
    b.setTitle("Test", for: .normal)
    return b
}()

lazy var barButton = UIBarButtonItem(customView: button)

Этот метод вызывается из viewDidLoad

func configNavBar() {
    navigationItem.rightBarButtonItem = barButton
}

Для анимации кнопки панели при возникновении каких-либо действий:

func animateRightBarButton() {
    UIView.animate(withDuration: 0.25,
                   delay: 0,
                   usingSpringWithDamping: 0.8,
                   initialSpringVelocity: 1.5,
                   options: .curveEaseInOut,
                   animations: {
                    guard let customView = self.barButton.customView else {return}
                    var x: CGFloat = customView.transform.tx == 0 ? 100 : 0
                    customView.transform = CGAffineTransform(scaleX: x, y: 0)
    }, completion: nil)
} 

Кнопка панели отображается, как и ожидалось, после загрузки представления. Я хочу, чтобы кнопка соскользнула с экрана, но я заметил пару проблем.

Кнопка исчезает из вида без анимации при вызове этой функции. Если I print(x) (значение x перевода), оно остается на 100.0 и не изменяется обратно на 0 с использованием троичного оператора. Спасибо за любую помощь, чтобы получить эту работу, спасибо.

1 Ответ

0 голосов
/ 21 октября 2019

используйте этот код:

let bell = UIImage(named: "gift")!
    let button = UIButton(type: .custom)
    button.translatesAutoresizingMaskIntoConstraints = false
    button.setBackgroundImage(bell, for: .normal)
    button.addTarget(self, action: #selector(self.showAdd), for: .touchUpInside)
    let bellButton = UIBarButtonItem(customView: button)
    self.navigationItem.leftBarButtonItem = bellButton
    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
        if let bell = self.navigationItem.leftBarButtonItem?.customView {
            let animation = CAKeyframeAnimation(keyPath: "transform.translation.x")
            animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear)
            animation.duration = 0.6
            animation.values = [-8.0, 8.0, -8.0, 8.0, -4.0, 4.0, -4.0, 4.0, 0.0 ]
            bell.layer.add(animation, forKey: "shake")
        }
    }
...