Положение центра UIView во время анимации
Я хотел бы определить, каково центральное положение UIVIew (средняя точка обзора) во время анимации. Анимация с UIViewPropertyAnimator, как это:
let animator = UIViewPropertyAnimator(duration: 10, curve: .easeInOut)
var circle : UIView!
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)
animator.addAnimations {
circle.center = CGPoint(x: 100,y: 100)
//or any other point
}
animator.startAnimation()
Если я напечатаю свойство circle.center во время анимации, то получу только конечную позицию анимации, а не реальную позицию.
Timer.scheduledTimer(withTimeInterval: 0.2, repeats: true, block: {
[weak self] (Timer) -> Void in
if let circleCenterPosition = self?.circle.center
{
print(circleCenterPosition)
}
})
После этой печати я увидел это на консоли:
(100,0, 100,0)
(100,0, 100,0)
...
Как я могу распечатать реальную позицию во время анимации?
Благодарю.
1 ответ
Я разобрался с возможным ответом.
CALayer имеет функцию представления ()
func presentation() Возвращает копию объекта уровня представления, который представляет состояние уровня в том виде, в котором оно отображается в данный момент на экране.
Уровень представления имеет свойство кадра, которое является CGRect, и отсюда легко вычислить среднюю точку.
демонстрация
Код
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()
}
}
Идея UIView пришла отсюда, определить центр анимации при анимации
Если у вас есть более простое или приятное решение, пожалуйста, добавьте ниже. Спасибо!