Слайд UIBarButtonItem слева - PullRequest
       26

Слайд UIBarButtonItem слева

0 голосов
/ 13 декабря 2018

При переходе на дополнительную страницу я пытаюсь сдвинуть кнопку назад слева в течение 0,33 секунды.Прямо сейчас анимация, кажется, не делает этого, даже после замедления до 2 секунд для визуального прояснения.Интересно, может ли кто-нибудь сказать мне, что я сделал неправильно в своем коде и как это исправить?

Собираюсь выйти и сказать, что, скорее всего, я просто неправильно понимаю, как работает какой-то аспект анимации.

func addBackButton() {
        let backButton = UIButton(type: .custom)
        backButton.setImage(#imageLiteral(resourceName: "backArrow"), for: .normal)
        backButton.setTitle("", for: .normal)
        backButton.setTitleColor(backButton.tintColor, for: .normal)
        backButton.addTarget(self, action: #selector(backAction), for: .touchUpInside)
        let backBarButtonItem = UIBarButtonItem(customView: backButton)
        backBarButtonItem.customView?.transform = CGAffineTransform(translationX: -backButton.frame.width, y: 0)
        navigationItem.leftBarButtonItems?.insert(backBarButtonItem, at: 0)
        UIView.animate(withDuration: 2, delay: 0.5, animations: {
            backBarButtonItem.customView?.transform = CGAffineTransform(translationX: 2 * backButton.frame.width, y: 0)
        })
    }

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

UIBarButtonItem не является подклассом UIView по причине.Если это именно тот эффект, который вам нужен (согласованность платформы говорит, что вы должны использовать UINavigationItem.setLeftBarButtonItems(_:animated:)), то вместо этого вы должны добавить backButton в иерархию представления, анимировать его, а затем установить его как leftBarButtonItem в блоке завершения.

Имейте в виду, что вам, вероятно, придется добавить его в иерархию представлений панели навигации, чтобы он отображался поверх него.Этот подход также означает, что вы в основном дублируете код компоновки панели навигации, и вам необходимо выяснить, где она должна заканчиваться.

navigationController?.navigationBar.addSubview(backButton)

// layout back button in it's final spot here, either via constraints or frame math

backButton.transform = CGAffineTransform(translationX: -(button.bounds.width + leadingSpacing), translationY: 0.0)

UIView.animate(duration: 0.3, animations: {
    backButton.transform = .identity
} { completed in
    self.navigationItem.leftBarButtonItem = UIBarButtonItem
}
0 голосов
/ 14 декабря 2018

Вам просто нужно поместить эту пользовательскую кнопку в containerView и установить containerView в качестве пользовательского представления UIBarButtonItem's.Ваша настройка будет выглядеть следующим образом:

let containerFrame = CGRect(origin: .zero, size: CGSize(width: 44.0, height: 44.0))
let container = UIView(frame: containerFrame)

let buttonFrame = CGRect(origin: CGPoint(x: -100, y: 0), size: CGSize(width: 44, height: 44))  
let backButton = UIButton(frame: buttonFrame)
backButton.setImage(#imageLiteral(resourceName: "backArrow"), for: .normal)
backButton.setTitle("", for: .normal)
backButton.setTitleColor(backButton.tintColor, for: .normal)
backButton.addTarget(self, action: #selector(backAction), for: .touchUpInside)
container.addSubview(backButton)

let backBarButtonItem = UIBarButtonItem(customView: container)
UIView.animate(withDuration: 2, delay: 0.5, animations: {
    backButton.transform = CGAffineTransform(translationX: 2 * backButton.frame.width, y: 0)
})

Вы можете проверить, почему вам нужно обернуть свой пользовательский button в другой UIView здесь .

...