Ios 立即更改AVCaptureVideoPreviewLayer位置

Ios 立即更改AVCaptureVideoPreviewLayer位置,ios,objective-c,Ios,Objective C,我在屏幕上有一个AVCaptureVideoPreviewLayer。我想在用户触摸按钮后立即更改其位置 我可以使用下面的代码来改变它的位置,但它不是立即发生的,而是通过某种平滑的线性过渡 CGRect frame = self.preview.frame; frame.origin.x = previewLeft; frame.origin.y = previewTop; self.preview.frame = frame; 如何使其在没有任何固有动画的情况下更改其位置?CALayer.f

我在屏幕上有一个AVCaptureVideoPreviewLayer。我想在用户触摸按钮后立即更改其位置

我可以使用下面的代码来改变它的位置,但它不是立即发生的,而是通过某种平滑的线性过渡

CGRect frame = self.preview.frame;
frame.origin.x = previewLeft;
frame.origin.y = previewTop;
self.preview.frame = frame;

如何使其在没有任何固有动画的情况下更改其位置?

CALayer.frame
是一个计算属性,但不能显式设置动画。通过设置它,还可以设置隐式动画的
位置

可以临时抑制所有动作,核心动画通过该机制创建其默认层动画:

Swift代码:

CATransaction.begin()
CATransaction.setDisableActions(true)

self.preview.frame = frame;

CATransaction.commit()
目标C代码:

[CATransaction begin];
[CATransaction setDisableActions:YES];

self.preview.frame = frame;

[CATransaction commit];

卢卡斯蒂兹马的答案是完美的

此外,解决这个问题还有一个诀窍

只需放慢车窗速度:

[(CALayer *)[[[[UIApplication sharedApplication] windows] objectAtIndex:0] layer] setSpeed:0.9];

在过渡后,不要忘记将其更正为
1.0f

一个可以工作,而另一个不行,这似乎很奇怪。当我在CA级别时,我几乎从不乱动
frame
。我不认为你是对的。仅仅因为
frame
触发动画并不意味着它是可设置动画的。这只是一个副作用,事实上,
position
是隐式动画。我在回答中张贴了文档说明。有一个
框架
属性。仅仅因为它是一个计算属性,并不意味着它不再是一个属性。。。