Невозможно использовать UIButton при использовании CABasicAnimation для его перемещения

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

Разве это не разрешено? Как это может быть сделано?

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

    @IBOutlet weak var button: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

        CATransaction.begin()

        let animation = CABasicAnimation(keyPath: "position")
        animation.fromValue = [view.layer.frame.width, 200]
        animation.toValue = [0, 200]
        animation.duration = 25.0
        animation.repeatCount = .greatestFiniteMagnitude

        button.layer.add(animation, forKey: "animatePosition")

        CATransaction.commit()
    }

При попытке нажать кнопку выдает следующее исключение:

*** Завершение работы приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: «- [__ NSArrayI pointValue]: нераспознанный селектор отправлен в экземпляр 0x2816c4a40»


person Curtain Call LLC    schedule 12.02.2020    source источник
comment
Попробуйте передать CGPoint вместо массива. Убедитесь, что ваш IBAction правильно подключен к вашей кнопке.   -  person Leo Dabus    schedule 12.02.2020
comment
@LeoDabus спасибо, я попробовал это, но все равно вылетает: animation.fromValue = CGPoint (x: view.layer.frame.width, y: 200.0) animation.toValue = CGPoint (x: 0, y: 200.0)   -  person Curtain Call LLC    schedule 12.02.2020
comment
Я думаю, ваша проблема в подключении кнопки. Отредактируйте свой вопрос и опубликуйте IBAction, которое должно вызываться при нажатии кнопки. Также вы должны указать, в какой строке возникает ваша ошибка.   -  person Leo Dabus    schedule 12.02.2020


Ответы (1)


Вы назначаете массив из двух числовых значений, а не ожидаемый тип позиции. Тип значения, ожидаемого CABasicAnimation, - NSValue(cgPoint:).

Вы исправите этот сбой следующим образом:

animation.fromValue = NSValue(cgPoint: CGPoint(x: view.layer.frame.width, y: 200.0))
animation.toValue = NSValue(cgPoint: CGPoint(x: 0, y: 200))
person Eugene Dudnyk    schedule 12.02.2020
comment
Спасибо, поэтому я попробовал то, что предложили вы и @Leo, но по-прежнему вылетает анимация. FromValue = CGPoint (x: view.layer.frame.width, y: 200.0) animation.toValue = CGPoint (x: 0, y: 200.0 ) - person Curtain Call LLC; 12.02.2020
comment
Что такое журнал сбоев после того, как вы перешли на NSValue? - person Eugene Dudnyk; 12.02.2020
comment
*** Завершение работы приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: «- [__ NSArrayI pointValue]: нераспознанный селектор отправлен в экземпляр 0x283c16620» - person Curtain Call LLC; 12.02.2020
comment
Добавьте точку останова All Exceptions и проверьте строку, на которой останавливается отладчик. Learnappmaking.com/wp-content/ загрузки / 2017/05 / - person Eugene Dudnyk; 12.02.2020
comment
не уверен, имеет ли это значение, но после того, как анимация завершится и кнопка появится снова - если вы нажмете на нее, она все равно вылетит. (и, конечно, если я отменю анимацию, она не вылетит) - person Curtain Call LLC; 12.02.2020
comment
- [__ NSArrayI pointValue]: нераспознанный селектор отправлен в экземпляр 0x283238fa0 @Eugene - person Curtain Call LLC; 12.02.2020
comment
Кажется, что строка кода, в которой происходит сбой, находится где-то еще, а не во фрагменте кода, который вы опубликовали, поскольку после того, как вы внесли изменения, которые я предложил, больше нет массивов ... Снова добавьте точку останова и найдите точный стек вызовов и строка в коде, вызывающая сбой. - person Eugene Dudnyk; 12.02.2020