Подтвердить что ты не робот

Отключение автоматического вращения для UIView

Мое приложение состоит из панели инструментов и AVCaptureVideoPreviewLayer в фоновом режиме UIView. Я хотел бы видеть, что панель инструментов вращается относительно ориентации устройства, поэтому в моем основном ViewController я реализовал функцию:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait
            || interfaceOrientation == UIInterfaceOrientationLandscapeLeft
            || interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

Это прекрасно работает, но когда меняется ориентация интерфейса, я вижу, что фоновый UIView (с видеослоем) также вращается, поэтому мое видео-представление теперь воспроизводится на 90 градусов влево или вправо... Что на самом деле не так cool!
Поэтому мой вопрос: есть ли способ отключить анимацию автоматического поворота на определенном UIView?

Я видел один похожий вопрос на этот вопрос: Отключение авторотации для одного UIView, но ответы не соответствуют моей проблеме, мне действительно нужен фоновый вид не двигаться, а не обойти проблему с помощью своего рода "счетной анимации". Поэтому я решил поднять эту тему.

Любые идеи?

Спасибо!

4b9b3361

Ответ 1

Попробуйте следующее:

myVideoCaptureLayer.orientationSupported = NO;

Ответ 2

Эта позиция указана в правильном направлении. Чтобы заставить 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;
    }];
}

Кажется, немного круглая, но она оживляет плавно. Другие виды поверх слоя предварительного просмотра автоматически вращаются так, как должны.

Ответ 3

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  return NO;
}

Или вы говорили, чтобы отключить его, только когда отображается определенное представление? Если это так, вы можете проверить это с помощью метода UIView isDescendantOfView.

Ответ 4

Я столкнулся с той же проблемой, хотя просто установить свойство ориентации на 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

Ответ 5

Наконец-то я нашел разумный ответ. Больше не нужно возиться с "антивращающими анимациями" и т.д.

Ключ должен использовать UIViewController для вашего уровня предварительного просмотра (невращающийся вид), а другой для реального интерфейса. Настройте параметры поворота для обеих сторон с использованием shouldAutorotateToInterfaceOrientation: (код находится в ответах выше):

  • Контроллер просмотра должен быть настроен не на поворот
  • Контроллер интерфейса должен быть настроен на поворот к требуемым ориентациям.

Важным моментом является сохранение ваших взглядов отдельно, добавив их непосредственно в окно. Я делаю это в AppDelegate:

[self.window addSubview:previewViewController.view];
[self.window addSubview:interfaceViewController.view];
self.window.rootViewController = interfaceViewController;
[self.window makeKeyAndVisible];

Это ставит ваш предварительный просмотр видео в фоновом режиме, а затем добавляет его интерфейс. Интерфейс свободен для авторотации, не затрагивая предварительный просмотр вообще.

Важно отметить: фон вашего интерфейса должен быть прозрачным, иначе он блокирует предварительный просмотр.