Ответ 1
Попробуйте следующее:
myVideoCaptureLayer.orientationSupported = NO;
Мое приложение состоит из панели инструментов и AVCaptureVideoPreviewLayer в фоновом режиме UIView. Я хотел бы видеть, что панель инструментов вращается относительно ориентации устройства, поэтому в моем основном ViewController я реализовал функцию:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait
|| interfaceOrientation == UIInterfaceOrientationLandscapeLeft
|| interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}
Это прекрасно работает, но когда меняется ориентация интерфейса, я вижу, что фоновый UIView (с видеослоем) также вращается, поэтому мое видео-представление теперь воспроизводится на 90 градусов влево или вправо... Что на самом деле не так cool!
Поэтому мой вопрос: есть ли способ отключить анимацию автоматического поворота на определенном UIView?
Я видел один похожий вопрос на этот вопрос: Отключение авторотации для одного UIView, но ответы не соответствуют моей проблеме, мне действительно нужен фоновый вид не двигаться, а не обойти проблему с помощью своего рода "счетной анимации". Поэтому я решил поднять эту тему.
Любые идеи?
Спасибо!
Попробуйте следующее:
myVideoCaptureLayer.orientationSupported = NO;
Эта позиция указана в правильном направлении. Чтобы заставить AVCaptureVideoPreviewLayer
не вращаться с устройством, я завернул его в UIView
и анимировал этот вид в противоположном направлении:
- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
float rotation;
if (toInterfaceOrientation==UIInterfaceOrientationPortrait) {
rotation = 0;
} else
if (toInterfaceOrientation==UIInterfaceOrientationLandscapeLeft) {
rotation = M_PI/2;
} else
if (toInterfaceOrientation==UIInterfaceOrientationLandscapeRight) {
rotation = -M_PI/2;
}
[UIView animateWithDuration:duration animations:^{
cameraPreview.transform = CGAffineTransformMakeRotation(rotation);
cameraPreview.frame = self.view.frame;
}];
}
Кажется, немного круглая, но она оживляет плавно. Другие виды поверх слоя предварительного просмотра автоматически вращаются так, как должны.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return NO;
}
Или вы говорили, чтобы отключить его, только когда отображается определенное представление? Если это так, вы можете проверить это с помощью метода UIView isDescendantOfView.
Я столкнулся с той же проблемой, хотя просто установить свойство ориентации на AVCaptureVideoPreviewLayer было недостаточно. Дополнительная проблема заключается в том, что CALayer не поддерживает менеджеров компоновки на iPhone, поэтому рамка видеослоя может быть неправильной при повороте устройства.
Я исправил это, используя пользовательский UIView, чтобы содержать AVCaptureVideoPreviewLayer, а затем я переопределил метод layoutSubviews для этого представления, чтобы гарантировать, что рамка видеослоя всегда установлена правильно. Это также хорошее место для установки свойства ориентации. То есть мой UIView выглядит так:
@implementation VideoPreview
@synthesize previewLayer;
- (void) layoutSubviews {
if (previewLayer) {
// set the correct orientation for the video layer
previewLayer.orientation = [[UIDevice currentDevice] orientation];
// and set its frame to that of its parent UIView
previewLayer.frame = self.bounds;
}
}
- (void) addPreviewLayer: (AVCaptureVideoPreviewLayer *) videoLayer {
previewLayer = videoLayer;
[self.layer addSublayer:videoLayer];
}
@end
Наконец-то я нашел разумный ответ. Больше не нужно возиться с "антивращающими анимациями" и т.д.
Ключ должен использовать UIViewController для вашего уровня предварительного просмотра (невращающийся вид), а другой для реального интерфейса. Настройте параметры поворота для обеих сторон с использованием shouldAutorotateToInterfaceOrientation: (код находится в ответах выше):
Важным моментом является сохранение ваших взглядов отдельно, добавив их непосредственно в окно. Я делаю это в AppDelegate:
[self.window addSubview:previewViewController.view];
[self.window addSubview:interfaceViewController.view];
self.window.rootViewController = interfaceViewController;
[self.window makeKeyAndVisible];
Это ставит ваш предварительный просмотр видео в фоновом режиме, а затем добавляет его интерфейс. Интерфейс свободен для авторотации, не затрагивая предварительный просмотр вообще.
Важно отметить: фон вашего интерфейса должен быть прозрачным, иначе он блокирует предварительный просмотр.