Только ландшафтный режим ОДИН ВИД

Я закончил приложение iOS, но мне нужно установить только ОДИН вид в альбомный режим, остальные виды можно увидеть только в портретном режиме.

Я использую Xcode 5.1, и я создал все свои представления, отбросив в своем раскадровке View Controllers с правой панели, поэтому, если вы собираетесь мне где-нибудь написать какой-нибудь код, скажите мне, где именно мне нужно напишите.

Я прочитал одно решение здесь UINavigationController Force Rotate, но я не знаю, где написать этот код. Мне нужно создать один UIViewController вручную?

Ответ 1

Я предполагаю, что вы ориентируетесь на iOS 7 здесь (используя XCode 5.1, я думаю, что я прав).

Во-первых, вы должны понимать, что для того, чтобы открыть хотя бы один вид из более чем 40 пейзажа, ваше приложение должно учитывать ориентацию ландшафта и портфолио. Это по умолчанию, но вы можете проверить его в своих целевых настройках, вкладке General, Deployment Info (см. Снимок экрана ниже).

enter image description here

Затем, поскольку вы разрешили как пейзаж, так и портрет для всего приложения, вам нужно будет сказать только портрет-только UIViewController, что он не должен авторотировать, добавив эту реализацию метода:

- (BOOL)shouldAutorotate {
  return NO;
}

Наконец, для вашего конкретного контроллера только для ландшафта, и поскольку вы сказали, что представляете его в виде модальности, вы можете просто реализовать эти методы:

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
  return UIInterfaceOrientationLandscapeLeft; // or Right of course
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
  return UIInterfaceOrientationMaskLandscape;
}

Надеюсь, это поможет,

Ответ 2

стриж

AppDelegate.swift

internal var shouldRotate = false
func application(_ application: UIApplication,
                 supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return shouldRotate ? .allButUpsideDown : .portrait
}

Ваш контроллер ландшафтного вида

let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.shouldRotate = true // or false to disable rotation

Objective-C

AppDelegate.h

@property (assign, nonatomic) BOOL shouldRotate;

AppDelegate.m

- (UIInterfaceOrientationMask)application:(UIApplication *)application
 supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    return self.shouldRotate ? UIInterfaceOrientationMaskAllButUpsideDown
                             : UIInterfaceOrientationMaskPortrait;
}

Ваш контроллер ландшафтного вида

AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
[appDelegate setShouldRotate:YES]; // or NO to disable rotation

Ответ 3

Чтобы следовать решению Ярослава, чтобы разрешить поворот в ландшафтный режим только в одном представлении, в контроллере ландшафтного представления должен быть установлен флажок mustRotate равным YES в его методе viewWillAppear и значением NO в его viewWillDisappear.

Если для viewWillAppear вы установите только значение YES в YES, после существования этого контроллера представления все другие контроллеры представления также будут поворачиваться. Таким образом, вы должны установитьShouldRotate в NO в его viewWillDisappear, чтобы ограничить поворот портретного представления.

Ответ 4

SWIFT4

Добавьте ниже строки кода в ваш AppDelegate

var orientationLock = UIInterfaceOrientationMask.portrait

    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        return self.orientationLock
    }

    struct AppUtility {
        static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {
            if let delegate = UIApplication.shared.delegate as? AppDelegate {
                delegate.orientationLock = orientation
            }
        }

        static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {
            self.lockOrientation(orientation)
            UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
        }
    }

Добавьте приведенный ниже код в контроллер, который вы хотите ландшафт

override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewWillAppear(_ animated: Bool) {
        AppDelegate.AppUtility.lockOrientation(UIInterfaceOrientationMask.landscapeRight, andRotateTo: UIInterfaceOrientation.landscapeRight)
    }

    override func viewWillDisappear(_ animated : Bool) {
        super.viewWillDisappear(animated)
        AppDelegate.AppUtility.lockOrientation(UIInterfaceOrientationMask.portrait, andRotateTo: UIInterfaceOrientation.portrait)
    }

Ответ 5

Вы должны объявить shouldRotate как внутреннее, чтобы избавиться от публичного свойства в отсутствии предупреждения общедоступного класса. internal var shouldRotate = false