立即更改AVCaptureVideoPreviewLayer位置

时间:2017-01-06 22:10:46

标签: ios objective-c

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

我可以使用以下代码更改其位置,但它不会立即发生,而是通过某种平滑的线性转换。

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

如何在没有任何内在动画的情况下改变它的位置?

2 个答案:

答案 0 :(得分:1)

LucasTizma的答案很完美。

此外,还有一个技巧可以解决此问题。

只需降低窗口速度:

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

在转换后,请不要忘记将其更正为1.0f

答案 1 :(得分:0)

不确定为什么会这样。 CALayer及其子类不会隐式动画frame更改动画。它暗含了position动画,但我并不认为内部模型更改会触发动画。

来自文档:

  

frame属性不能直接设置动画。相反,您应该设置边界,anchorPoint和位置属性的适当组合的动画,以实现所需的结果。

您的框架更改只是设置position

无论如何,您可以暂时禁止所有操作:

Swift代码:

CATransaction.begin()
CATransaction.setDisableActions(true)

self.preview.frame = frame;

CATransaction.commit()

Objective-C代码:

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

self.preview.frame = frame;

[CATransaction commit];