Как мне получить кнопку для анимации? - PullRequest
0 голосов
/ 11 июля 2019

Я создал функцию @IBAction, соединяющую мою кнопку в контроллере представления с основной раскадровкой. Цель состоит в том, чтобы заставить мою кнопку сделать анимацию встряхивания, но я не знаю, как ее подключить. Я получаю сообщение об ошибке Декларация действительна только в области действия файла в строке extension UIButton {. Нужно ли избавляться от расширения? Переместить другие линии вокруг? Как мне получить кнопку для анимации? Ниже приведен код, который показан для запуска mapkit. Мне нужно создать еще один класс?

Я попытался полностью удалить расширение, переименовав имя перед UIButton и изменив UIButton () на другие имена, попытался просмотреть учебные пособия, но ничего не подходит именно тому, что у меня есть.

//button
@IBAction func diceButton(_ sender: UIButton) {
    //shake button


    //shake
    extension UIButton {

        func buttonshake() {
            let shake = CABasicAnimation(keyPath: "position")
            shake.duration = 0.1
            shake.repeatCount = 2
            shake.autoreverses = true

            let fromPoint = CGPoint(x: center.x - 5, y: center.y)
            let fromValue = NSValue(cgPoint: fromPoint)

            let toPoint = CGPoint(x: center.x + 5, y: center.y)
            let toValue = NSValue(cgPoint: toPoint)

            shake.fromValue = fromValue
            shake.toValue = toValue

            layer.add(shake, forKey: nil)

        }
    }

}

Ошибка возникает в строке под // shake и больше нигде. Это все в действии кнопки, и у меня в коде нет другой кнопки, поэтому я не вижу ничего, что могло бы повторяться.

1 Ответ

0 голосов
/ 11 июля 2019

Вам необходимо переместить extension на верхний уровень из любого определения func или class.

Лучше всего создать новый файл, назвать его UIButton+Shake.swift и добавить в него свое расширение.

Затем в IBAction просто позвонить buttonshake


UIButton + Shake.swift

extension UIButton {

    func buttonshake() {
        let shake = CABasicAnimation(keyPath: "position")

        // And all the other stuff

        layer.add(shake, forKey: nil)
    }
}

YourController.swift

class YourController : UIViewController {
    // ...
    @IBAction func diceButton(_ sender: UIButton) {
        sender.buttonshake()
    }
}
...