Обратный вызов во время анимации UIVIew/CALayer

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

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

Также я пробовал решение из этого поста: Обратный вызов основного процесса анимации, но он не работает также.

Я надеялся, что будут вызваны drawInRect, layoutSubviews или что-то подобное, но этого не происходит.

Любая помощь будет оценена по достоинству.


person Cosmin    schedule 13.05.2014    source источник
comment
может использовать метод CAAnimationDelegate animationDidEnd:   -  person WCByrne    schedule 13.05.2014
comment
Меня не интересует событие didEnd. Меня интересует обратный вызов, который вызывается во время анимации.   -  person Cosmin    schedule 13.05.2014
comment
Имейте в виду, что движется презентационный слой, а CALayer сохраняет свою позицию до тех пор, пока анимация не закончится, поэтому наблюдение за CALayer, безусловно, не сработает.   -  person MDB983    schedule 13.05.2014
comment
Может быть, какое-то понимание того, чего вы пытаетесь достичь, отслеживая анимацию.   -  person WCByrne    schedule 14.05.2014
comment
Мне нужно вызвать метод, который выполняет некоторые действия в зависимости от положения анимированного UIView, поэтому я хочу вызывать его каждый раз, когда представление меняет свое положение.   -  person Cosmin    schedule 15.05.2014
comment
этот ответ выглядит хорошо: stackoverflow.com/questions/18827973 /   -  person Sentry.co    schedule 20.02.2016


Ответы (1)


Вы можете добавить таймер и добавить timeInterval, где вы хотите любое действие.

let animation = CABasicAnimation(keyPath: "strokeEnd")
    animation.delegate = self
   animation.fromValue = 0
   animation.duration = 3
   shapeLayer.add(animation, forKey: "MyAnimation")

   // save shape layer

   self.shapeLayer = shapeLayer

    timer.invalidate() // just in case this button is tapped multiple times

    // start the timer
    timer = Timer.scheduledTimer(timeInterval: 3/5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)


@objc func timerAction() {
   print("done")
}

У меня есть 5 точек и проходящий анимационный слой на каждой точке, я должен выполнить какое-то действие.

person Vijay Patidar    schedule 27.01.2020