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, но я не думал, что внутренние изменения модели вызвали анимацию.

Из документации:

Фрейм свойство непосредственно не анимируемым. Вместо этого вы должны анимировать соответствующую комбинацию границ, свойств anchorPoint и position для достижения желаемого результата.

Смена рамки только устанавливает 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]; 
+0

Кажется странным, что один будет работать, но не другой. Я почти никогда не общаюсь с «фреймом», когда я нахожусь на уровне СА. – LucasTizma

+0

Я не думаю, что ты прав. Просто потому, что триггеры 'frame' ** ** анимация не означает, что она анимативна. Это просто побочный эффект, и на самом деле «позиция» - это то, что неявно анимируется. Я отправил записку с документацией в свой ответ. – LucasTizma

+0

Существует свойство 'frame'. Просто потому, что это вычисленное свойство не делает его менее подходящим ... – LucasTizma

Смежные вопросы