我有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大小和原点? 或者可能有其他方法来追踪它?
答案 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
(只是一个猜测,虽然我怀疑它也不会起作用)。