Требуется помощь в настройке интерфейса, в котором для большинства элементов установлено фиксированное вращение, но окна оповещения и общего доступа автоматически поворачиваются вместе с устройством.

Я работаю с Xcode 7 и Swift 2. Я работаю над интерфейсом со слоем предварительного просмотра камеры и элементами управления, которые отображаются аналогично родному приложению для камеры iOS. Все элементы управления остаются на месте при повороте устройства, но значки "поворачиваются" на месте для правильной ориентации устройства. (Надеюсь, я объяснил это таким образом, чтобы это имело смысл. Если нет, откройте приложение родной камеры на вашем iPhone и несколько раз переверните устройство, чтобы увидеть, о чем я говорю.)

У меня уже работает базовый интерфейс, исправляя общую ориентацию интерфейса с помощью:

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.LandscapeRight
}

Затем я использую преобразование, чтобы повернуть каждую кнопку для ориентации устройства.

Проблема заключается в следующем: мне нужно иметь возможность представлять сообщения оповещения (UIAlertController) и интерфейс общего доступа (UIActivityViewController) в этом же интерфейсе. Как заставить эти элементы вращаться в правильной ориентации, сохраняя при этом остальную часть интерфейса статичной?

На мой взгляд, здесь есть два возможных подхода - я просто не знаю, как заставить один из них работать:

  1. Установите интерфейс на автоматический поворот и поддержите все ориентации, но отключите автоматический поворот для видов, которые мне нужно сохранить на месте.

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

1 ответ

Получил это работает. Мне нужно было получить доступ к представленному ViewController.view, чтобы повернуть предупреждение и поделиться мнениями.

//used to periodically trigger a check of orientation
var updateTimer: NSTimer?

//Checks if the device has rotated and, if so, rotates the controls. Also prompts the user that portrait orientation is bad.
func checkOrientation(timer: NSTimer) {
    //Array of the views that need to be rotated as the device rotates
    var viewsToRotate = [oneView, anotherView]

    //This adds the alert or sharing view to the list, if there is one
    if let presentedVC = presentedViewController?.view {
        viewsToRotate.append(presentedVC)
    }

    //Rotate all of the views identified above
    for viewToRotate in viewsToRotate {
        switch UIDevice.currentDevice().orientation {
        case UIDeviceOrientation.Portrait:
            viewToRotate.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI_2))
        case UIDeviceOrientation.PortraitUpsideDown:
            viewToRotate.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2))
        case UIDeviceOrientation.LandscapeRight:
            viewToRotate.transform = CGAffineTransformMakeRotation(CGFloat(2 * M_PI_2))
        default:
            viewToRotate.transform = CGAffineTransformMakeRotation(CGFloat(0))
        }
    }
}
Другие вопросы по тегам