2017-01-06 2 views
0

화면에 AVCaptureVideoPreviewLayer가 있습니다. 사용자가 버튼을 터치 한 후 즉시 위치를 변경하고 싶습니다.즉시 AVCaptureVideoPreviewLayer 위치를 변경하십시오.

다음 코드를 사용하여 위치를 변경할 수는 있지만 순간적으로 발생하지는 않지만 일종의 부드러운 라이너 전환이 있습니다.

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

어떤 종류의 내장 애니메이션없이 위치를 변경하려면 어떻게해야합니까?

답변

0

왜 그런지 잘 모르겠습니다. CALayer 및 해당 하위 클래스는 암시 적으로 frame 개의 변경 사항을 애니메이션으로 적용하지 않습니다. 암시 적으로 position에 애니메이션을 적용했지만 내부 모델 변경으로 인해 애니메이션이 실행되지는 않는다고 생각합니다. 문서에서

:

프레임 속성을 직접 애니메이션이 아니다. 대신 원하는 결과를 얻으려면 bounds, anchorPoint 및 position 속성의 적절한 조합을 애니메이션으로 만들어야합니다.

프레임 변경은 position을 설정하는 것입니다.

에 관계없이, 당신은 일시적으로 모든 작업을 억제 할 수

스위프트 코드 :

CATransaction.begin() 
CATransaction.setDisableActions(true) 

self.preview.frame = frame; 

CATransaction.commit() 

목표 - C 코드 :

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

self.preview.frame = frame; 

[CATransaction commit]; 
+0

하나가 작동하지만 다른하지 않을 것이라고 이상한 것 같다. 내가 CA 레벨에있을 때 나는 거의 '프레임'으로 돌아 다니지 않는다. – LucasTizma

+0

나는 당신이 옳다고 생각하지 않는다. 'frame' **이 애니메이션을 트리거하기 때문에 그것이 애니메이션 가능하다는 것을 의미하지는 않습니다. 이것은 단지 부작용이며, 실제로 '위치'는 암시 적으로 움직이는 것입니다. 내 답변에 설명서를 게시했습니다. – LucasTizma

+0

'frame' 속성이 있습니다. 그냥 계산 된 속성 때문에 재산의 적게하지 않습니다 ... – LucasTizma

관련 문제