UIView анимация определяет центр во время анимации - PullRequest
1 голос
/ 01 июля 2011

Я использую метод + animateWithDuration:delay:options:animations:completion: UIView для перемещения моего вида вдоль линии в течение нескольких секунд или около того.

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

Причина, по которой я это делаю, заключается в том, что у меня естьNSTimer срабатывает каждые 0,1 секунды (или около того), что обновит родительское представление, чтобы показать строку, где ранее был UIView.Я хочу иметь возможность обновлять его по мере продвижения UIView.

Есть идеи, как это сделать?Единственный похожий вопрос, который я нашел, был http://forums.macrumors.com/showthread.php?t=1056105,, но разрешение не показано.

В качестве альтернативы ... есть ли лучшие способы сделать это?

Спасибо!

Ответы [ 2 ]

10 голосов
/ 01 июля 2011

UIViews поддерживаются CALayers, и именно этот слой выполняет фактическую анимацию. CALayer предоставляет свойство presentationLayer, которое при обращении возвращает копию CALayer, которая, насколько это возможно, представляет текущее состояние, видимое для пользователя. Запрашивая view.layer.presentationLayer.frame, вы можете получить кадр слоя, видимый пользователю прямо сейчас, и это соответствует кадру UIView.

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

Я знаю, что слишком поздно, но, возможно, это может помочь кому-то еще.

CALayer имеет функцию представления ()

Функциональная презентация () Возвращает копию объекта уровня представления, который представляет состояние уровня в том виде, в котором оно отображается в данный момент на экране.

уровень представления имеет свойство frame, такое как CGRect, и отсюда легко вычислить среднюю точку.

Демо

enter image description here

код в быстром 3

class ViewController: UIViewController {
        var circle : UIView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let animator = UIViewPropertyAnimator(duration: 10, curve: .easeInOut)
        circle = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 40.0, height: 40.0))
        circle.layer.cornerRadius = 20.0
        circle.backgroundColor = UIColor.blue
        self.view.addSubview(circle)
        Timer.scheduledTimer(withTimeInterval: 0.2, repeats: true)
        {
            [weak self] (myTimer) -> Void in
            if let movingBlueDotFrame = self?.circle.layer.presentation()?.frame
            {
                let blueDotOriginPoint = movingBlueDotFrame.origin
                let blueDotMiddlePoint = CGPoint(x: blueDotOriginPoint.x + movingBlueDotFrame.width/2, y: blueDotOriginPoint.y + movingBlueDotFrame.height/2)
                print(blueDotMiddlePoint)
                if blueDotMiddlePoint == CGPoint(x:100,y:100){
                    print("Yeeaahh")
                    myTimer.invalidate()
                }
            }
       }
        animator.addAnimations {
            self.circle.center = CGPoint(x: 100,y: 100)
        }
        animator.startAnimation()
    }
}
...