我在屏幕上有一个AVCaptureVideoPreviewLayer。我想在用户触摸按钮后立即改变它的位置。
我可以使用以下代码更改其位置,但它不会立即发生,而是通过某种平滑的线性转换。
CGRect frame = self.preview.frame;
frame.origin.x = previewLeft;
frame.origin.y = previewTop;
self.preview.frame = frame;
如何在没有任何内在动画的情况下改变它的位置?
答案 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];