动画期间的 UIView 中心位置
UIView center position during animation
我想确定,动画期间 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)
...
如何打印动画中的真实位置?
谢谢。
我想出了一个可能的答案。
CALayer 有一个 presentation() 函数
func presentation()
Returns a copy of the presentation layer object that represents the state of the layer as it currently appears onscreen.
表示层有一个框架属性什么是 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 animation determine center during animation
如果您有更简单或更好的解决方案,请在下面添加。谢谢!
我想确定,动画期间 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)
...
如何打印动画中的真实位置?
谢谢。
我想出了一个可能的答案。
CALayer 有一个 presentation() 函数
func presentation() Returns a copy of the presentation layer object that represents the state of the layer as it currently appears onscreen.
表示层有一个框架属性什么是 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 animation determine center during animation
如果您有更简单或更好的解决方案,请在下面添加。谢谢!