如何在动画时获取UIView帧的原点和大小

时间:2010-12-12 16:00:41

标签: iphone core-animation

我有UIView动画

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:25]; 
myview.frame = CGRectMake(218, 216, myview.frame.size.width * 0.5, myview.frame.size.height * 0.5);
[UIView commitAnimations];

和NSTimer使用回调方法。问题:是否有可能在计时器回调方法中获取当前的myview.frame大小和原点? 或者可能有其他方法来追踪它?

3 个答案:

答案 0 :(得分:12)

我很确定这是不可能的,因为当您更改视图的frame时,它会立即生效。在后台,Core Animation负责动画。所以,即使你可以抓住框架,它也会给你最终的坐标,而不是动画中的当前坐标。

访问属性的表示层,如评论中NWCoder所指出的那样。请参阅documentation

[view.layer.presentationLayer frame]

答案 1 :(得分:2)

NWCoder是对的。我将在C#中给你一个例子,因为我在MonoTouch中编码。

   RectangleF start = new RectangleF(0,0,100,100);
   RectangleF end = new RectangleF(100,100,100,100);
   UIView yourView = new UIView(start);

   UIView.Animate (120d, 0d, UIViewAnimationOptions.CurveLinear, delegate {
    yourView.Frame = end;
   }, delegate { });

上面的代码块会在120秒内将yourView从0,0移动到100,100。动画开始的那一刻,你的View.Frame已经设置为(100,100,100,100)...所以你的View.Frame.X将在整个120秒内等于100。

另一方面,如果您在120秒内的任何时间使用下面的第一行......

   float currentX = yourView.Layer.PresentationLayer.Frame.X
   float currentProp = yourView.Layer.PresentationLayer.Frame.<any other frame property>

...你在做生意。您将在动画制作时获得实时帧属性。

效果很好。我现在正在我的应用程序中使用它。

答案 2 :(得分:1)

在动画过程中,视图的帧不会更新,正如您已经想到的那样。你可以尝试myview.layer.frame(只是一个猜测,虽然我怀疑它也不会起作用)。